sql >> Database teknologi >  >> RDS >> Oracle

Hvordan husker jeg, hvilken vej PRIOR skal gå i CONNECT BY-forespørgsler

Jeg forsøger altid at sætte udtrykkene i JOIN er i følgende rækkefølge:

joined.column = leading.column

Denne forespørgsel:

SELECT  t.value, d.name
FROM    transactions t
JOIN
        dimensions d
ON      d.id = t.dimension

kan behandles enten som "find det tilsvarende dimensionsnavn for hver transaktion" eller "find alle tilsvarende transaktionsværdier for hver dimension".

Så hvis jeg søger efter en given transaktion, sætter jeg udtrykkene i følgende rækkefølge:

SELECT  t.value, d.name
FROM    transactions t
JOIN
        dimensions d
ON      d.id = t.dimension
WHERE   t.id = :myid

, og hvis jeg søger efter en dimension, så:

SELECT  t.value, d.name
FROM    dimensions d
JOIN
        transactions t
ON      t.dimension = d.id
WHERE   d.id = :otherid

Den tidligere forespørgsel vil højst sandsynligt bruge indeksscanninger først på (t.id) , derefter på (d.id ), mens sidstnævnte vil bruge indeksscanninger først på (d.id) , derefter på (t.dimension) , og du kan nemt se det i selve forespørgslen:de søgte felter er til venstre.

Køre- og køretabellerne er måske ikke så tydelige i en JOIN , men det er lige så tydeligt som en klokke for en CONNECT BY forespørgsel:PRIOR rækken kører, den ikke-PRIOR er kørt.

Det er derfor denne forespørgsel:

SELECT  *
FROM    hierarchy
START WITH
        id = :root
CONNECT BY
        parent = PRIOR id

betyder "find alle rækker, hvis parent er et givet id ". Denne forespørgsel opbygger et hierarki.

Dette kan behandles sådan her:

connect_by(row) {
  add_to_rowset(row);

  /* parent = PRIOR id */
  /* PRIOR id is an rvalue */
  index_on_parent.searchKey = row->id;

  foreach child_row in index_on_parent.search {
    connect_by(child_row);
  }
}

Og denne forespørgsel:

SELECT  *
FROM    hierarchy
START WITH
        id = :leaf
CONNECT BY
        id = PRIOR parent

betyder "find de rækker, hvis id er en given parent ". Denne forespørgsel bygger en herkomstkæde.

Indsæt altid PRIOR i højre del af udtrykket.

Tænk på PRIOR column som konstant vil alle dine rækker blive søgt efter.



  1. Vis poster, der tæller data for en bestemt kolonne og opsummerer samlede beløb

  2. Hvad er den mest effektive måde at gemme en sorteringsrækkefølge på en gruppe af poster i en database?

  3. Er der en måde at TRUNCATE de fleste tabeller i et MySQL-skema?

  4. Linq-forespørgsel opfører sig ikke som forventet