Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak zapamiętać, w którą stronę powinien iść PRIOR w zapytaniach CONNECT BY?

Zawsze staram się umieszczać wyrażenia w JOIN jest w następującej kolejności:

joined.column = leading.column

To zapytanie:

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

można traktować jako „dla każdej transakcji znajdź odpowiednią nazwę wymiaru” lub „dla każdego wymiaru znajdź wszystkie odpowiadające wartości transakcji”.

Tak więc, jeśli szukam danej transakcji, układam wyrażenia w następującej kolejności:

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

, a jeśli szukam wymiaru, to:

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

Poprzednie zapytanie najprawdopodobniej użyje najpierw skanowania indeksu w (t.id) , a następnie (d.id ), podczas gdy ta ostatnia użyje najpierw skanowania indeksu w (d.id) , a następnie (t.dimension) , i możesz to łatwo zobaczyć w samym zapytaniu:przeszukiwane pola znajdują się po lewej stronie.

Tabele sterujące i sterowane mogą nie być tak oczywiste w JOIN , ale jest to jasne jak dzwonek dla CONNECT BY zapytanie:PRIOR rząd prowadzi, nie PRIOR jest napędzany.

Dlatego to zapytanie:

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

oznacza "znajdź wszystkie wiersze, których parent jest podanym id ". To zapytanie tworzy hierarchię.

Można to potraktować w następujący sposób:

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

I to zapytanie:

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

oznacza "znajdź wiersze, których id jest danym parent ". To zapytanie tworzy łańcuch przodków.

Zawsze umieszczaj PRIOR w prawej części wyrażenia.

Pomyśl o PRIOR column na stałe wszystkie Twoje wiersze będą wyszukiwane.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. INSTR() Funkcja w Oracle

  2. Jak uzyskać wartość ASCII w Oracle?

  3. Sprawdzenie, czy pozycja nie istnieje w innej tabeli

  4. Jak wybrać typ zbiorczej zebranej tabeli rekordów?

  5. Oracle 12c PLSQL SOAP EXTRACTVALUE z odpowiedzi Array