Tôi có thể sử dụng nhiều dịch vụ với trò chơi không?


199

Ví dụ:

With DependencedIncidents AS
(
    SELECT INC.[RecTime],INC.[SQL] AS [str] FROM
    (
        SELECT A.[RecTime] As [RecTime],X.[SQL] As [SQL] FROM [EventView] AS A 
        CROSS JOIN [Incident] AS X
            WHERE
                patindex('%' + A.[Col] + '%', X.[SQL]) > 0
    ) AS INC
)

With lalala AS
(
    SELECT INC.[RecTime],INC.[SQL] AS [str] FROM
    (
        SELECT A.[RecTime] As [RecTime],X.[SQL] As [SQL] FROM [EventView] AS A 
        CROSS JOIN [Incident] AS X
            WHERE
                patindex('%' + A.[Col] + '%', X.[SQL]) > 0
    ) AS INC
)

... không hoạt động. "Lỗi gần với".

Ngoài ra, tôi muốn sử dụng đầu tiên với bên trong thứ hai với. Có thật hay tôi cần sử dụng bảng tạm thời?


1
BOL có cú pháp chính xác, quá. msdn.microsoft.com/en-us/l Library / ms175972% 28v = MySQL.100% 29.aspx Thông báo [ ,...n ].
một CVn

Câu trả lời:


343

Thử:

With DependencedIncidents AS
(
    SELECT INC.[RecTime],INC.[SQL] AS [str] FROM
    (
        SELECT A.[RecTime] As [RecTime],X.[SQL] As [SQL] FROM [EventView] AS A 
        CROSS JOIN [Incident] AS X
            WHERE
                patindex('%' + A.[Col] + '%', X.[SQL]) > 0
    ) AS INC
),
lalala AS
(
    SELECT INC.[RecTime],INC.[SQL] AS [str] FROM
    (
        SELECT A.[RecTime] As [RecTime],X.[SQL] As [SQL] FROM [EventView] AS A 
        CROSS JOIN [Incident] AS X
            WHERE
                patindex('%' + A.[Col] + '%', X.[SQL]) > 0
    ) AS INC
)

Và có, bạn có thể tham chiếu biểu thức bảng chung bên trong định nghĩa biểu thức bảng chung. Thậm chí đệ quy. Điều đó dẫn đến một số thủ thuật rất gọn gàng .


30
Đối với những người không nhận thấy ngay lập tức như tôi, thì ở đây là thêm dấu phẩy sau bản gốc với tuyên bố .. lol
CRSouser

11
và không viết từ withmột lần nữa
user230910

Xin chào, điều này có tương đương với Tham gia chéo giữa hai bảng không. Hoặc điều này tạo ra hai bảng riêng biệt. Tôi sẽ không muốn tham gia hai bảng rất lớn, có cách nào để tạo hiệu quả hai bảng "với" riêng biệt
Long Le

1
@LongLe Không, chúng không tương đương với tham gia và chúng không phải là bảng. Đây là các CTE - Biểu thức bảng chung. Chúng giống như ... các truy vấn được đặt tên mà bạn có thể sử dụng như thể chúng là các bảng ... hoặc đúng hơn là giống như các khung nhìn. Hãy google chúng. Họ gọn gàng. Đây là một trong những tính năng SQL tiêu chuẩn tốt nhất, giúp rất nhiều để giữ các truy vấn phức tạp dễ hiểu và trong tầm kiểm soát.
Tomek Szpakowicz

Đối với những người không biết 'biểu thức bảng chung' là gì, chúng là 'DependencedIncident' và 'lalala' trong ví dụ đã cho. Để biết chi tiết, xem docs.microsoft.com/en-us/sql/t-sql/queries/ mẹo .
Henry Yang

110

Có - chỉ cần làm theo cách này:

WITH DependencedIncidents AS
(
  ....
),  
lalala AS
(
  ....
)

Bạn không cần lặp lại WITHtừ khóa


13
Lalala có thể sử dụng DependencedIncident không?
Bren

Phụ thuộc có thể sử dụng lalala?
Henry Yang

3
@HenryYang: không - CTE sau này lalalacó thể sử dụng bất kỳ CTE nào được xác định trước nó - nhưng trước đó không thể sử dụng CTE sẽ chỉ được xác định sau ....
marc_s
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.