Puis-je utiliser plusieurs «avec»?


199

Par exemple:

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
)

... ne fonctionne pas. "Erreur près de".

De plus, je veux utiliser d'abord avec l'intérieur puis avec. Est-ce réel ou dois-je utiliser des tables temporaires?


1
BOL a également la syntaxe exacte. msdn.microsoft.com/en-us/library/ms175972%28v=SQL.100%29.aspx Remarque [ ,...n ].
un CVn

Réponses:


343

Essayer:

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
)

Et oui, vous pouvez référencer l'expression de table commune dans la définition d'expression de table commune. Même récursivement. Ce qui conduit à des astuces très soignées .


30
Pour ceux qui ne l'ont pas immédiatement remarqué comme moi, la capture ici ajoute une virgule après l'original avec la déclaration .. lol
CRSouser

11
et ne pas écrire le mot withnouveau
user230910

Bonjour, est-ce l'équivalent d'une jointure croisée entre deux tables. Ou cela crée-t-il deux tables distinctes. Je ne voudrais pas croiser deux tables très grandes, existe-t-il un moyen de créer efficacement deux tables "avec" distinctes
Long Le

1
@LongLe Non, ils ne sont pas équivalents à des jointures et ce ne sont pas des tables. Ce sont des CTE - Common Table Expressions. Ils ressemblent plus à ... des requêtes nommées que vous pouvez utiliser comme s'il s'agissait de tables ... ou plutôt à des vues. Veuillez les rechercher sur Google. Ils sont soignés. C'est l'une des meilleures fonctionnalités SQL standard, aidant énormément à garder les requêtes complexes compréhensibles et sous contrôle.
Tomek Szpakowicz

Pour ceux qui ne savent pas ce que sont les «expressions de table communes», ce sont «DependencedIncidents» et «lalala» dans l'exemple donné. Pour plus de détails, voir docs.microsoft.com/en-us/sql/t-sql/queries/… .
Henry Yang

110

Oui - faites-le de cette façon:

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

Vous n'avez pas besoin de répéter le WITHmot clé


13
Lalala peut-elle utiliser des incidents dépendants?
Bren

DependencedIncidents peut-il utiliser lalala?
Henry Yang

3
@HenryYang: non - le dernier CTE ( lalala) peut utiliser n'importe quel CTE défini avant - mais le précédent ne peut pas utiliser un CTE qui ne sera défini que plus tard ....
marc_s
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.