Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да си спомня в каква посока трябва да върви PRIOR в заявките CONNECT BY

Винаги се опитвам да поставя изразите в JOIN е в следния ред:

joined.column = leading.column

Тази заявка:

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

може да се третира или като „за всяка транзакция намерете съответното име на измерение“, или „за всяко измерение намерете всички съответстващи стойности на транзакция“.

Така че, ако търся дадена транзакция, поставям изразите в следния ред:

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

и ако търся измерение, тогава:

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

Предишната заявка най-вероятно ще използва индексни сканирания първо на (t.id) , след това върху (d.id ), докато последният ще използва индексни сканирания първо на (d.id) , след това върху (t.dimension) и можете лесно да го видите в самата заявка:полетата за търсене са вляво.

Задвижващите и управляваните таблици може да не са толкова очевидни в JOIN , но е ясно като звънец за CONNECT BY заявка:PRIOR редът се управлява, не-PRIOR се управлява.

Ето защо тази заявка:

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

означава „намиране на всички редове, чийто parent е даден id ". Тази заявка изгражда йерархия.

Това може да се третира по следния начин:

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

И тази заявка:

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

означава „намерете редовете, чийто id е даден parent ". Тази заявка изгражда верига от предци.

Винаги поставяйте PRIOR в дясната част на израза

Помислете за PRIOR column като константа всички ваши редове ще бъдат търсени.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да деинсталирате / напълно да премахнете Oracle 11g (клиент)?

  2. JDBC връзка към база данни на Oracle с помощта на TLS сертификат

  3. Как да разрешите ORA-00900

  4. Функция ROWIDTOCHAR() в Oracle

  5. Първи стъпки с Oracle SQL Developer в Windows