Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm cách nào để tôi nhớ con đường nào PRIOR sẽ đi trong truy vấn CONNECT BY

Tôi luôn cố gắng đặt các biểu thức trong JOIN theo thứ tự sau:

joined.column = leading.column

Truy vấn này:

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

có thể được coi như "cho mỗi giao dịch, tìm tên thứ nguyên tương ứng" hoặc "cho mỗi thứ nguyên, tìm tất cả các giá trị giao dịch tương ứng".

Vì vậy, nếu tôi tìm kiếm một giao dịch nhất định, tôi đặt các biểu thức theo thứ tự sau:

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

và nếu tôi tìm kiếm thứ nguyên, thì:

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

Truy vấn trước đây của họ hầu hết có thể sẽ sử dụng quét chỉ mục trước trên (t.id) , rồi bật (d.id ), trong khi cái sau sẽ sử dụng quét chỉ mục trước trên (d.id) , sau đó trên (t.dimension) và bạn có thể dễ dàng nhìn thấy nó trong chính truy vấn:các trường được tìm kiếm nằm ở bên trái.

Các bảng điều khiển và điều khiển có thể không quá rõ ràng trong JOIN , nhưng nó rõ ràng như một hồi chuông cho một CONNECT BY truy vấn:PRIOR hàng đang lái xe, hàng không phải PRIOR được thúc đẩy.

Đó là lý do tại sao truy vấn này:

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

có nghĩa là "tìm tất cả các hàng có parent là một id nhất định ". Truy vấn này xây dựng một hệ thống phân cấp.

Điều này có thể được xử lý như thế này:

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

Và truy vấn này:

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

có nghĩa là "tìm các hàng có idparent nhất định ". Truy vấn này xây dựng một chuỗi tổ tiên.

Luôn đặt PRIOR trong phần bên phải của biểu thức.

Hãy nghĩ đến PRIOR column như một hằng số, tất cả các hàng của bạn sẽ được tìm kiếm.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. R tới Kết nối Oracle bằng ODBC

  2. trả về một hàng trong thủ tục được lưu trữ trên oracle

  3. đầu ra của hai truy vấn khác nhau do một kết quả trong SQL oracle

  4. Cho phép Oracle biến đổi các vị từ được kết nối OR thành UNION ALL hoạt động

  5. Hàm COSH () trong Oracle