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?

cnd
la source
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 .

Tomek Szpakowicz
la source
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é

marc_s
la source
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