Làm cách nào để có nhiều biểu thức bảng chung trong một câu lệnh SELECT?


93

Tôi đang trong quá trình đơn giản hóa một câu lệnh select phức tạp, vì vậy tôi nghĩ rằng tôi sẽ sử dụng các biểu thức bảng phổ biến.

Tuyên bố một cte hoạt động tốt.

WITH cte1 AS (
    SELECT * from cdr.Location
    )

select * from cte1 

Có thể khai báo và sử dụng nhiều cte trong cùng một SELECT không?

tức là sql này báo lỗi

WITH cte1 as (
    SELECT * from cdr.Location
)

WITH cte2 as (
    SELECT * from cdr.Location
)

select * from cte1    
union     
select * from cte2

lỗi là

Msg 156, Level 15, State 1, Line 7
Incorrect syntax near the keyword 'WITH'.
Msg 319, Level 15, State 1, Line 7
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.

NB. Tôi đã thử đặt dấu chấm phẩy và gặp lỗi này

Msg 102, Level 15, State 1, Line 5
Incorrect syntax near ';'.
Msg 102, Level 15, State 1, Line 9
Incorrect syntax near ';'.

Có lẽ không liên quan nhưng điều này là trên SQL 2008.

Câu trả lời:


140

Tôi nghĩ nó phải là một cái gì đó như:

WITH 
    cte1 as (SELECT * from cdr.Location),
    cte2 as (SELECT * from cdr.Location)
select * from cte1 union select * from cte2

Về cơ bản, WITHchỉ là một mệnh đề ở đây, và giống như các mệnh đề khác có danh sách, "," là dấu phân cách thích hợp.


Thật tuyệt vời. Tôi đã điền vào các bảng tạm thời với kết quả của CTE và kết hợp sau đó, nhưng lại gặp vấn đề với dấu chấm phẩy khi đóng gói thành một proc được lưu trữ. Phương pháp hay!
Tom Halladay

18
Đừng quên rằng cte2có thể tham khảo cte1như sau: ... cte2 như (SELECT * FROM cte1 WHERE ...)
Chahk

Anh hùng! Này được ghé thăm tôi bối rối trong nhiều giờ
bjpelcdev

2
còn việc khai báo các biểu thức đệ quy và không đệ quy thì sao?
Dmitry Volkov

15

Câu trả lời được đề cập ở trên là đúng:

WITH 
    cte1 as (SELECT * from cdr.Location),
    cte2 as (SELECT * from cdr.Location)
select * from cte1 union select * from cte2

Ngoài ra, bạn cũng có thể truy vấn từ cte1 trong cte2:

WITH 
    cte1 as (SELECT * from cdr.Location),
    cte2 as (SELECT * from cte1 where val1 = val2)

select * from cte1 union select * from cte2

val1,val2 chỉ là giả định cho các biểu thức ..

Hy vọng blog này cũng sẽ giúp ích: http://iamfixed.blogspot.de/2017/11/common-table-expression-in-sql-with.html


còn việc khai báo các biểu thức đệ quy và không đệ quy thì sao?
Dmitry Volkov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.