Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie kann ich mir merken, wie PRIOR in CONNECT BY-Abfragen gehen soll?

Ich versuche immer, die Ausdrücke in JOIN einzufügen in der folgenden Reihenfolge:

joined.column = leading.column

Diese Abfrage:

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

kann entweder wie "für jede Transaktion den entsprechenden Dimensionsnamen suchen" oder "für jede Dimension alle entsprechenden Transaktionswerte finden" behandelt werden.

Wenn ich also nach einer bestimmten Transaktion suche, gebe ich die Ausdrücke in der folgenden Reihenfolge ein:

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

, und wenn ich nach einer Dimension suche, dann:

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

Die frühere Abfrage wird höchstwahrscheinlich zuerst Index-Scans auf (t.id) verwenden , dann auf (d.id ), während letzteres Index-Scans zuerst auf (d.id) verwendet , dann auf (t.dimension) , und Sie können es leicht in der Abfrage selbst sehen:Die durchsuchten Felder sind auf der linken Seite.

Die Driving- und Driven-Tabellen sind in einem JOIN möglicherweise nicht so offensichtlich , aber es ist so klar wie eine Glocke für ein CONNECT BY Abfrage:der PRIOR Zeile steuert, die Nicht-PRIOR gefahren wird.

Deshalb diese Abfrage:

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

bedeutet "alle Zeilen finden, deren parent ist eine gegebene id ". Diese Abfrage baut eine Hierarchie auf.

Dies kann wie folgt behandelt werden:

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

Und diese Abfrage:

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

bedeutet "Finde die Zeilen, deren id ist ein gegebener parent ". Diese Abfrage baut eine Ahnenkette auf.

Immer PRIOR eingeben im rechten Teil des Ausdrucks.

Denken Sie an PRIOR column ab sofort werden alle Ihre Zeilen durchsucht.