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?


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 .


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.