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?

cnd
quelle
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 .

Tomek Szpakowicz
quelle
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

marc_s
quelle
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