2011-07-25 28 views
7

Tôi sẽ yêu cầu trợ giúp để hiểu được tất cả RDBMS nào từ Oracle, DB2, Sybase hỗ trợ biểu thức bảng chung (CTE) trong truy vấn phụ. Tôi biết rằng PostgreSQL làm trong khi MS SQL Server không.Biểu thức bảng chung trong Sub-Query

SELECT a.*, b.* 
FROM (WHERE aa as (
      <<select_query>), 
      SELECT * 
      FROM aa 
      WHERE <<criteria>> 
    ) as a 
    LEFT JOIN (
     WITH bb as (
      <<select_query> 
     ), 
     select * from bb inner join tbl_c on <<innerjoin>> where <<criteria>> 
    ) as b 
    on <<join_expr>> 

Tôi không thể xác định mệnh đề có bên ngoài các truy vấn phụ - cả hai truy vấn đều được tạo động w.r.t. các cột, tiêu chí, bảo mật, v.v. Ngoài ra, chính truy vấn trên có thể được sử dụng trong truy vấn khác dưới dạng truy vấn phụ. Tóm lại, nguyên tắc là lượt xem được tạo động, có thể sử dụng lại sau. Một số truy vấn có thể có tối đa 10-12 lượt xem động như vậy được hợp nhất với nhau. Vấn đề là ứng dụng được cho là có cơ sở dữ liệu bất khả tri ít nhất là PG, Oracle & DB2 có liên quan và các tính năng không được hỗ trợ bởi một ứng dụng không được triển khai.

+2

Oracle gọi nó là "truy vấn phụ" và sử dụng nó để xác định trong truy vấn con đánh tôi như một sự lựa chọn tồi. Cao hơn, phạm vi sử dụng rộng hơn. –

Trả lời

3

Đó không phải là trực tiếp một câu trả lời cho câu hỏi của bạn, nhưng có lẽ bạn có thể nghĩ về điều này:

SQL Server dường như để hạn chế ngữ nghĩa (không nhất thiết phải là cú pháp) của SQL mà nó làm cho tinh thần để làm như vậy. Ví dụ: bạn không thể có truy vấn con với điều khoản ORDER BY, nếu bạn cũng không chỉ định mệnh đề TOP n. Điều này có ý nghĩa, như các truy vấn con được sắp xếp là vô nghĩa trừ khi chúng có giới hạn. RDBMS khác cho phép vô nghĩa như vậy.

Trong trường hợp của bạn (chỉ là phỏng đoán), việc CTE trong truy vấn phụ chỉ có ý nghĩa hạn chế, bởi vì bạn có thể viết lại toàn bộ truy vấn theo cách mà CTE được khai báo ở cấp cao nhất. Sự khác biệt duy nhất bạn sẽ có là phạm vi và có thể dễ đọc của mỗi tuyên bố.

Mặt khác, CTE của phép cho các truy vấn đệ quy, mà có thể rất khó để áp dụng khi CTE của được khai báo trong truy vấn con ...

Vì bạn cần phải thực hiện cơ sở dữ liệu-agnostic SQL, tôi khuyên bạn không sử dụng nhiều CTE. Nếu CTE đơn giản, bạn luôn có thể viết lại chúng dưới dạng số lần xem đơn giản ...

+0

Chắc chắn. Tại thời điểm này, đó là những gì chúng tôi buộc phải làm vào lúc này. Tuy nhiên, bạn có thể nhận xét về các RDBMS khác hỗ trợ "WITH" trong truy vấn bên trong không? – Kapil

+0

@Kapil, thật không may, tôi không thể nói với bạn nhiều hơn thế này.Tôi chưa thử sử dụng mệnh đề 'WITH' trong các truy vấn lồng nhau. Tuy nhiên, tôi không nghĩ đó là một vấn đề chung, nếu CTE không đệ quy. –

4

Có, bạn có thể sử dụng CTE trong truy vấn phụ trong Oracle. Từ số Oracle 11g docs:

Bạn có thể chỉ định mệnh đề này trong bất kỳ câu lệnh SELECT cấp cao nhất nào và trong hầu hết các loại truy vấn phụ. Tên truy vấn hiển thị với truy vấn chính và cho tất cả các truy vấn phụ tiếp theo. Đối với bao thanh toán truy vấn con đệ quy, tên truy vấn thậm chí còn hiển thị với truy vấn con xác định truy vấn tên chính nó.

Như một ví dụ, công trình này trong Oracle:

SELECT a.*, b.* 
    FROM (WITH aa AS 
     (
      SELECT LEVEL l1, mod(level, 5) m1 FROM dual CONNECT BY LEVEL < 50 
     ) 
     SELECT * FROM aa WHERE m1 < 3) a LEFT JOIN 
     (WITH bb AS 
     (
      SELECT LEVEL l2, mod(level, 5) m2 FROM dual CONNECT BY LEVEL < 50 
     ) 
     SELECT * FROM bb WHERE m2 BETWEEN 1 AND 4) b 
     ON a.l1 = b.l2; 
0

Microsoft SQL Server phiên bản mới hơn làm hỗ trợ CTE của.

+0

Bit vẫn không hỗ trợ cho truy vấn phụ như trong câu hỏi: http://stackoverflow.com/questions/1914151/how-we-can-use-cte-in-subquery-in-sql-server) – Vadzim

0

Trong khi PostgreSQL hỗ trợ CTE, chúng là một rào cản tối ưu hóa ngăn chặn biến vị ngữ hoặc tham gia đẩy vào truy vấn CTE. Điều này làm cho chúng kém hiệu quả trong nhiều trường hợp hơn là truy vấn phụ đơn giản.

Các vấn đề liên quan