sql >> Databáze >  >> RDS >> Oracle

Jak si pamatuji, kterým směrem by se měl PRIOR ubírat v dotazech CONNECT BY

Vždy se snažím vkládat výrazy do JOIN 's v následujícím pořadí:

joined.column = leading.column

Tento dotaz:

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

lze zacházet buď jako „pro každou transakci vyhledejte odpovídající název dimenze“ nebo „pro každou dimenzi vyhledejte všechny odpovídající hodnoty transakce“.

Pokud tedy hledám danou transakci, dám výrazy v následujícím pořadí:

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

a pokud hledám dimenzi, pak:

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

Předchozí dotaz bude s největší pravděpodobností nejprve používat prohledávání indexů na (t.id) a poté na (d.id ), zatímco druhý z nich bude používat indexové skenování nejprve na (d.id) a poté na (t.dimension) a můžete to snadno vidět v samotném dotazu:hledaná pole jsou vlevo.

Řídicí a řízené tabulky nemusí být v JOIN tak zřejmé , ale je to jasné jako zvonek pro CONNECT BY dotaz:PRIOR řádek je hnací, jiný než PRIOR je řízen.

Proto tento dotaz:

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

znamená "najít všechny řádky, jejichž parent je dané id ". Tento dotaz vytváří hierarchii.

."

S tím lze zacházet takto:

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

A tento dotaz:

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

znamená "najít řádky, jejichž id je daný parent ". Tento dotaz vytváří řetězec předků.

Vždy zadávejte PRIOR v pravé části výrazu.

Přemýšlejte o PRIOR column od konstanty budou prohledány všechny vaše řádky.



  1. jak obnovit postgresql DB bez zálohy

  2. Změna kódování znaků MySQL. Je zachována integrita dat?

  3. Sloučit výsledky tabulky do sloupců (kontingenční/kontingenční?)

  4. Počítejte aktivní uživatele pomocí časového razítka přihlášení v MySQL