Posso usare più "con"?


199

Solo per esempio:

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
)

... non funziona. "Errore vicino a con".

Inoltre, voglio usare prima con dentro il secondo con. È reale o devo usare le tabelle temporanee?


1
Anche BOL ha la sintassi esatta. msdn.microsoft.com/en-us/library/ms175972%28v=SQL.100%29.aspx Avviso [ ,...n ].
un CVn del

Risposte:


343

Provare:

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
)

E sì, puoi fare riferimento all'espressione di tabella comune all'interno della definizione di espressione di tabella comune. Anche ricorsivamente. Il che porta ad alcuni trucchi molto accurati .


30
Per quelli che non l'hanno notato immediatamente come me, la cattura qui sta aggiungendo una virgola dopo l'originale con la dichiarazione .. lol
CRSouser

11
e non scrivere la parola withancora una volta
user230910

Salve, equivale a un Cross Join tra due tabelle. Oppure crea due tabelle separate. Non vorrei incrociare due tavoli molto grandi, c'è un modo per creare in modo efficiente due tavoli "con" separati
Long Le

1
@LongLe No, non sono equivalenti ai join e non sono tabelle. Questi sono CTE: espressioni di tabella comuni. Sono più simili a ... query denominate che è possibile utilizzare come se fossero tabelle ... o piuttosto più come viste. Per favore, cercali su Google. Sono puliti. È una delle migliori funzionalità SQL standard, che aiuta enormemente a mantenere comprensibili e sotto controllo le query complesse.
Tomek Szpakowicz,

Per coloro che non sanno quali sono le "espressioni comuni da tavolo", sono "Dipendenti dipendenti" e "lalala" nell'esempio fornito. Per i dettagli, consultare docs.microsoft.com/en-us/sql/t-sql/queries/… .
Henry Yang,

110

Sì, fallo in questo modo:

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

Non è necessario ripetere la WITHparola chiave


13
Lalala può usare DependencedIncidents?
Bren,

Gli ospiti dipendenti possono usare lalala?
Henry Yang,

3
@HenryYang: no - il CTE successivo ( lalala) può usare qualsiasi CTE definito prima di esso - ma il precedente non può usare un CTE che verrà definito solo in seguito ....
marc_s
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.