sql >> Database >  >> RDS >> Oracle

Hoe onthoud ik welke kant PRIOR op moet gaan in CONNECT BY-query's?

Ik probeer altijd de uitdrukkingen in JOIN te zetten is in de volgende volgorde:

joined.column = leading.column

Deze vraag:

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

kan worden behandeld als "vind voor elke transactie de bijbehorende dimensienaam", of "vind voor elke dimensie alle bijbehorende transactiewaarden".

Dus als ik naar een bepaalde transactie zoek, plaats ik de uitdrukkingen in de volgende volgorde:

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

, en als ik naar een dimensie zoek, dan:

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

De vorige zoekopdracht zal hoogstwaarschijnlijk eerst indexscans gebruiken op (t.id) , dan op (d.id ), terwijl de laatste indexscans eerst zal gebruiken op (d.id) , dan op (t.dimension) , en je kunt het gemakkelijk zien in de zoekopdracht zelf:de gezochte velden staan ​​links.

De drijvende en gereden tabellen zijn misschien niet zo duidelijk in een JOIN , maar het is zo duidelijk als een bel voor een CONNECT BY vraag:de PRIOR rij rijdt, de niet-PRIOR wordt gereden.

Daarom deze vraag:

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

betekent "vind alle rijen waarvan de parent is een gegeven id ". Deze zoekopdracht bouwt een hiërarchie op.

Dit kan als volgt worden behandeld:

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

En deze vraag:

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

betekent "vind de rijen waarvan id is een gegeven parent ". Deze zoekopdracht bouwt een vooroudersketen op.

Zet altijd PRIOR in het rechtergedeelte van de uitdrukking.

Denk aan PRIOR column vanaf een constante worden al uw rijen doorzocht.



  1. geen modulenamen _mysql; waar is _mysql

  2. Rijen en kolommen (ook wel pivot genoemd) alleen transponeren met een minimum AANTAL()?

  3. Vanwege een syntaxisfout wordt de tabel niet gemaakt in DB

  4. WooCommerce geserialiseerde metawaarde-array in wp_postmeta-tabel