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

Sự khác biệt giữa mệnh đề WITH và truy vấn con?

WITH mệnh đề dành cho truy vấn con, còn được gọi là biểu thức bảng thông thường hoặc CTE:

Mệnh đề WITH query_name cho phép bạn gán tên cho một khối truy vấn con. Sau đó, bạn có thể tham chiếu khối truy vấn con ở nhiều vị trí trong truy vấn bằng cách chỉ định tên_của_câu. Cơ sở dữ liệu Oracle tối ưu hóa truy vấn bằng cách coi tên truy vấn như một dạng xem nội tuyến hoặc như một bảng tạm thời.

Trong ví dụ thứ hai, bạn đã gọi là temp_table là một chế độ xem nội tuyến, không phải là một bảng tạm thời.

Trong nhiều trường hợp, lựa chọn sử dụng tùy thuộc vào phong cách ưa thích của bạn và CTE có thể làm cho mã dễ đọc hơn, đặc biệt với nhiều cấp truy vấn con (tất nhiên là các ý kiến ​​khác nhau). Nếu bạn chỉ tham khảo CTE / chế độ xem nội tuyến một lần, bạn có thể sẽ không thấy bất kỳ sự khác biệt nào về hiệu suất và trình tối ưu hóa có thể kết thúc với cùng một kế hoạch.

Tuy nhiên, chúng đặc biệt hữu ích khi bạn cần sử dụng cùng một truy vấn con ở nhiều nơi, chẳng hạn như trong một liên hợp. Bạn có thể kéo chế độ xem nội tuyến vào CTE để mã không bị lặp lại và nó cho phép trình tối ưu hóa hiện thực hóa nó nếu nó cho rằng điều đó có lợi.

Ví dụ, ví dụ có sẵn sau:

select curr from (
  select curr from tableone t1
  left join tabletwo t2 on (t1.empid = t2.empid)
) temp_table
where curr >= 0
union all
select -1 * curr from (
  select curr from tableone t1
  left join tabletwo t2 on (t1.empid = t2.empid)
) temp_table
where curr < 0

có thể được cấu trúc lại thành:

with temp_table as (
  select curr from tableone t1
  left join tabletwo t2 on (t1.empid = t2.empid)
)
select curr from temp_table
where curr >= 0
union all
select -1 * curr from temp_table
where curr < 0

Truy vấn con không còn phải lặp lại. Mã lặp lại càng phức tạp thì việc sử dụng CTE theo quan điểm duy trì càng có lợi. Và truy vấn con càng đắt tiền thì hiệu suất càng cao mà bạn có thể xem từ việc sử dụng CTE, mặc dù trình tối ưu hóa thường khá tốt trong việc tìm ra những gì bạn đang là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. Cách trích xuất số tuần trong sql

  2. Sự khác biệt giữa BYTE và CHAR trong các kiểu dữ liệu cột

  3. Có thể xảy ra bế tắc khi cập nhật và xóa các hàng khác nhau trong bảng không?

  4. Oracle DB Server + APEX + ORDS + JasperReports từ đầu (Phần 4)

  5. Xoay vòng một bảng trong SQL (tức là lập bảng chéo / lập bảng chéo)