Bisakah saya menggunakan beberapa "dengan"?


199

Sebagai contoh saja:

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
)

... tidak bekerja. "Kesalahan dekat dengan".

Juga, saya ingin menggunakan pertama dengan di dalam kedua. Apakah ini nyata atau saya perlu menggunakan tabel temp?


1
BOL juga memiliki sintaks yang tepat. msdn.microsoft.com/en-us/library/ms175972%28v=SQL.100%29.aspx Pemberitahuan [ ,...n ].
CVn

Jawaban:


343

Mencoba:

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
)

Dan ya, Anda bisa referensi ekspresi tabel umum di dalam definisi ekspresi tabel umum. Bahkan secara rekursif. Yang mengarah pada beberapa trik yang sangat rapi .


30
Bagi mereka yang tidak segera menyadarinya seperti saya, tangkapan di sini adalah menambahkan koma setelah aslinya dengan pernyataan .. lol
CRSouser

11
dan tidak menulis kata withlagi
user230910

Hai, apakah ini setara dengan Cross Join di antara dua tabel. Atau apakah ini membuat dua tabel terpisah. Saya tidak ingin bergabung dengan dua tabel yang sangat besar, apakah ada cara untuk secara efisien membuat dua tabel "dengan" yang terpisah
Long Le

1
@ LongLe Tidak, mereka tidak setara dengan bergabung dan mereka bukan tabel. Ini adalah CTE - Common Table Expressions. Mereka lebih seperti ... kueri bernama yang dapat Anda gunakan seolah-olah itu adalah tabel ... atau lebih tepatnya tampilan. Silakan google mereka. Mereka rapi. Ini adalah salah satu fitur SQL standar terbaik, sangat membantu untuk menjaga agar pertanyaan kompleks dapat dipahami dan terkendali.
Tomek Szpakowicz

Bagi mereka yang tidak tahu apa 'ekspresi tabel umum', mereka adalah 'DependencedIncidents' dan 'lalala' dalam contoh yang diberikan. Untuk detail, lihat docs.microsoft.com/en-us/sql/t-sql/queries/… .
Henry Yang

110

Ya - lakukan saja seperti ini:

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

Anda tidak perlu mengulangi WITHkata kunci


13
Bisakah lalala menggunakan DependencedIncidents?
Bren

Bisakah DependencedIncidents menggunakan lalala?
Henry Yang

3
@HenryYang: tidak - CTE nanti ( lalala) dapat menggunakan CTE apa pun yang ditentukan sebelumnya - tetapi yang sebelumnya tidak dapat menggunakan CTE yang hanya akan ditentukan nanti ....
marc_s
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.