여러 개의 "with"를 사용할 수 있습니까?


200

예를 들면 다음과 같습니다.

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
)

... 작동하지 않습니다. "With near near"입니다.

또한 내부 초를 먼저 사용하고 싶습니다. 실제입니까 아니면 임시 테이블을 사용해야합니까?


1
BOL도 정확한 구문을 가지고 있습니다. msdn.microsoft.com/en-us/library/ms175972%28v=SQL.100%29.aspx 공지 사항 [ ,...n ].
CVn

답변:


345

시험:

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
CRSouser

11
단어를 with다시 쓰지 않음
user230910

안녕하세요, 이것은 두 테이블 간의 크로스 조인과 같습니다. 아니면 두 개의 별도 테이블을 만듭니다. 두 개의 매우 큰 테이블을 조인하고 싶지는 않습니다. 두 개의 "with"테이블을 효율적으로 만드는 방법이
Long Le

1
@LongLe 아니요, 조인과 같지 않으며 테이블이 아닙니다. 이들은 CTE-공통 테이블 표현식입니다. 그것들은 마치 테이블처럼 사용할 수있는 명명 된 쿼리와 비슷합니다. Google에 알려주십시오. 그들은 깔끔합니다. 이는 최고의 표준 SQL 기능 중 하나로서 복잡한 쿼리를 이해하고 제어 할 수 있도록 크게 도와줍니다.
Tomek Szpakowicz

'공통 테이블 식'이 무엇인지 모르는 사람들은 주어진 예에서 'DependencedIncidents'와 'lalala'입니다. 자세한 내용은 docs.microsoft.com/en-us/sql/t-sql/queries/…를 참조하십시오 .
Henry Yang

112

예-그냥 이렇게하십시오 :

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

WITH키워드 를 반복 할 필요가 없습니다


13
lalala가 DependencedIncidents를 사용할 수 있습니까?
Bren

DependencedIncidents가 lalala를 사용할 수 있습니까?
Henry Yang

3
@HenryYang : 아니오-나중의 CTE ( lalala)는 이전에 정의 된 CTE를 사용할 수 있지만, 이전의 CTE는 나중에 정의 될 CTE를 사용할 수 없습니다 ....
marc_s
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.