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.