複数の「with」を使用できますか?


199

ちょうど例:

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
)

...動作しません。「ウィズに近いエラー」。

また、まずは内側で、次は内側で使用したいと思います。それは本当ですか、それとも一時テーブルを使用する必要がありますか?


1
BOLにも正確な構文があります。msdn.microsoft.com/en-us/library/ms175972%28v=SQL.100%29.aspx Notice [ ,...n ]
CVn 2011年

回答:


343

試してください:

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
)

そして、はい、共通テーブル式定義内で共通テーブル式を参照できます。再帰的にでも。これはいくつかの非常にきちんとしたトリックにつながります。


30
私のようにすぐに気付かなかった人のために、ここでのキャッチは、元のwithステートメントの後にコンマを追加することです
。lol

11
単語をwithもう書いていない
user230910

こんにちは、これは2つのテーブル間のクロス結合に相当します。または、2つの別個のテーブルを作成しますか。2つの非常に大きなテーブルをクロス結合したくありません。2つの「with」テーブルを効率的に作成する方法はありますか
Long Le

1
@LongLeいいえ、これらは結合と同等ではなく、テーブルでもありません。これらはCTE-Common Table Expressionsです。それらは...テーブルのように使用できる名前付きクエリに似ています...またはビューのようなものです。それらをググってください。彼らはきちんとしている。これは最高の標準SQL機能の1つであり、複雑なクエリを理解しやすく、制御下に置くのに非常に役立ちます。
Tomek Szpakowicz

「共通のテーブル式」が何であるかを知らない人のために、それらは与えられた例では「DependencedIncidents」と「lalala」です。詳細については、docs.microsoft.com/en-us/sql/t-sql/queries/…を参照してください。
Henry Yang

110

はい-このようにしてください:

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

WITHキーワードを繰り返す必要はありません


13
lalalaはDependencedIncidentsを使用できますか?
ブレン

DependencedIncidentsはラララを使用できますか?
Henry Yang

3
@HenryYang:いいえ-後のCTE(lalala)はそれより前に定義された任意のCTEを使用できます-しかし、前のCTEは後でのみ定義されるCTEを使用できません...
marc_s
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.