sql >> Databasteknik >  >> RDS >> Oracle

Hur kommer jag ihåg vilken väg PRIOR ska gå i CONNECT BY-frågor

Jag försöker alltid lägga uttrycken i JOIN är i följande ordning:

joined.column = leading.column

Denna fråga:

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

kan behandlas antingen som "för varje transaktion, hitta motsvarande dimensionsnamn" eller "för varje dimension, hitta alla motsvarande transaktionsvärden".

Så om jag söker efter en given transaktion lägger jag uttrycken i följande ordning:

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

, och om jag söker efter en dimension, då:

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

Den tidigare frågan kommer troligen att använda indexsökningar först på (t.id) , sedan på (d.id ), medan den senare kommer att använda indexsökningar först på (d.id) , sedan på (t.dimension) , och du kan enkelt se det i själva frågan:de sökta fälten är till vänster.

Tabellerna för körning och körning kanske inte är så uppenbara i en JOIN , men det är lika tydligt som en klocka för en CONNECT BY fråga:PRIOR raden kör, den icke-PRIOR är körd.

Det är därför denna fråga:

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

betyder "hitta alla rader vars parent är ett givet id ". Den här frågan bygger en hierarki.

Detta kan behandlas så här:

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);
  }
}

Och den här frågan:

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

betyder "hitta raderna vars id är en given parent ". Den här frågan bygger en härkomstkedja.

Sätt alltid PRIOR i den högra delen av uttrycket.

Tänk på PRIOR column som konstant kommer alla dina rader att sökas efter.



  1. MySQL OPTIMERA alla tabeller?

  2. SQL gå med hjälp för vänlistan

  3. Datetime-problem med vb.net och MSSQL

  4. JDBC returnerar fel antal berörda rader