Kann ich mehrere "mit" verwenden?


198

Nur zum Beispiel:

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
)

... funktioniert nicht. "Fehler in der Nähe von Mit".

Außerdem möchte ich erstens mit innen zweitens mit verwenden. Ist es echt oder muss ich temporäre Tabellen verwenden?


1
BOL hat auch die genaue Syntax. msdn.microsoft.com/en-us/library/ms175972%28v=SQL.100%29.aspx Hinweis [ ,...n ].
ein CVn

Antworten:


342

Versuchen:

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
)

Und ja, Sie können auf den allgemeinen Tabellenausdruck innerhalb der Definition des allgemeinen Tabellenausdrucks verweisen. Auch rekursiv. Was zu einigen sehr netten Tricks führt .


30
Für diejenigen, die es nicht sofort bemerkt haben wie ich, ist der Haken hier das Hinzufügen eines Kommas nach dem Original mit Aussage .. lol
CRSouser

11
und nicht schreibt das Wort withwieder
user230910

Hallo, entspricht dies einem Cross Join zwischen zwei Tabellen? Oder werden dadurch zwei separate Tabellen erstellt. Ich möchte nicht zwei sehr große Tabellen kreuzen, gibt es eine Möglichkeit, zwei separate "mit" -Tabellen effizient zu erstellen
Long Le

1
@LongLe Nein, sie sind nicht gleichbedeutend mit Joins und keine Tabellen. Dies sind CTEs - Common Table Expressions. Sie ähneln eher ... benannten Abfragen, die Sie verwenden können, als wären sie Tabellen ... oder eher Ansichten. Bitte googeln Sie sie. Sie sind ordentlich. Es ist eine der besten Standard-SQL-Funktionen, die enorm dazu beiträgt, komplexe Abfragen verständlich und unter Kontrolle zu halten.
Tomek Szpakowicz

Für diejenigen, die nicht wissen, was "allgemeine Tabellenausdrücke" sind, sind sie im angegebenen Beispiel "DependencedIncidents" und "lalala". Weitere Informationen finden Sie unter docs.microsoft.com/en-us/sql/t-sql/queries/… .
Henry Yang

110

Ja - mach es einfach so:

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

Sie müssen das WITHSchlüsselwort nicht wiederholen


13
Kann lalala DependencedIncidents verwenden?
Bren

Können DependencedIncidents Lalala verwenden?
Henry Yang

3
@ HenryYang: Nein - der spätere CTE ( lalala) kann jeden zuvor definierten CTE verwenden - aber der frühere kann keinen CTE verwenden, der erst später definiert wird ....
marc_s
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.