Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana saya mengingat ke arah mana SEBELUM harus pergi di CONNECT BY query

Saya selalu mencoba untuk menempatkan ekspresi di JOIN dalam urutan sebagai berikut:

joined.column = leading.column

Kueri ini:

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

dapat diperlakukan seperti "untuk setiap transaksi, temukan nama dimensi yang sesuai", atau "untuk setiap dimensi, temukan semua nilai transaksi yang sesuai".

Jadi, jika saya mencari transaksi tertentu, saya menempatkan ekspresi dalam urutan berikut:

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

, dan jika saya mencari dimensi, maka:

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

Permintaan sebelumnya kemungkinan besar akan menggunakan pemindaian indeks terlebih dahulu pada (t.id) , lalu pada (d.id ), sedangkan yang terakhir akan menggunakan scan indeks terlebih dahulu pada (d.id) , lalu pada (t.dimension) , dan Anda dapat dengan mudah melihatnya dalam kueri itu sendiri:bidang yang dicari ada di sebelah kiri.

Tabel penggerak dan yang digerakkan mungkin tidak begitu jelas dalam JOIN , tapi sejelas lonceng untuk CONNECT BY kueri:PRIOR baris mengemudi, non-PRIOR didorong.

Itu sebabnya pertanyaan ini:

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

berarti "temukan semua baris yang parent adalah id yang diberikan ". Kueri ini membangun hierarki.

Ini bisa diperlakukan seperti ini:

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

Dan pertanyaan ini:

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

berarti "menemukan baris yang id adalah parent yang diberikan ". Kueri ini membangun rantai leluhur.

Selalu cantumkan PRIOR di bagian kanan ekspresi.

Pikirkan PRIOR column secara konstan semua baris Anda akan dicari.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dukungan Bool Oracle SQL

  2. Pesan kesalahan ASP Classic SQL Query, tolong sintaks yang benar

  3. ORA-01111 dalam MRP dalam database Siaga Fisik

  4. Metode ExecuteBatch mengembalikan array nilai -2 di java

  5. Oracle Database BLOB ke InputStream di Jawa?