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.