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?

cnd
sumber
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 .

Tomek Szpakowicz
sumber
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

marc_s
sumber
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