Czy mogę używać wielu „z”?

199

Na przykład:

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
)

... nie działa. „Błąd w pobliżu za”.

Chcę też użyć najpierw z wewnątrz drugiego z. Czy to prawda, czy muszę używać tabel tymczasowych?

cnd
źródło
1
BOL ma również dokładną składnię. msdn.microsoft.com/en-us/library/ms175972%28v=SQL.100%29.aspx Uwaga [ ,...n ].
CVn

Odpowiedzi:

343

Próbować:

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
)

I tak, możesz odwoływać się do wspólnego wyrażenia tabelowego w definicji wspólnego wyrażenia tabelowego. Nawet rekurencyjnie. Co prowadzi do bardzo schludnych sztuczek .

Tomek Szpakowicz
źródło
30
Dla tych, którzy nie zauważyli tego od razu tak jak ja,
haczykiem
11
i nie pisząc withponownie słowa
użytkownik230910
Cześć, czy to jest równoważne łączeniu krzyżowemu między dwiema tabelami. Czy tworzy to dwie osobne tabele. Nie chciałbym krzyżować łączenia dwóch bardzo dużych tabel, czy istnieje sposób na skuteczne utworzenie dwóch oddzielnych tabel „z”
Long Le
1
@LongLe Nie, nie są równoważne złączeniom i nie są tabelami. Są to CTE - wspólne wyrażenia tabelowe. Są bardziej jak ... nazwane zapytania, których można użyć tak, jakby były tabelami ... a raczej bardziej jak widoki. Proszę google. Są schludne. Jest to jedna z najlepszych standardowych funkcji SQL, która niezwykle pomaga utrzymać zrozumiałość i kontrolę nad złożonymi zapytaniami.
Tomek Szpakowicz
Dla tych, którzy nie wiedzą, jakie są „wspólne wyrażenia tabelowe”, w podanym przykładzie są to „DependencedIncident” i „lalala”. Aby uzyskać szczegółowe informacje, zobacz docs.microsoft.com/en-us/sql/t-sql/queries/… .
Henry Yang
111

Tak - po prostu zrób to w ten sposób:

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

Nie musisz powtarzać WITHsłowa kluczowego

marc_s
źródło
13
Czy lalala może używać zdarzeń zależnych?
Bren
Czy Zależne Zdarzenia mogą korzystać z lalala?
Henry Yang
3
@HenryYang: nie - późniejszy CTE ( lalala) może użyć dowolnego zdefiniowanego wcześniej CTE - ale wcześniejszy nie może użyć CTE, który zostanie zdefiniowany dopiero później ...
marc_s