Posso usar vários "com"?

199

Apenas por exemplo:

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
)

... não funciona. "Erro perto de Com".

Além disso, eu quero usar primeiro com dentro de segundo com. É real ou preciso usar tabelas temporárias?

cnd
fonte
1
O BOL também possui a sintaxe exata. msdn.microsoft.com/en-us/library/ms175972%28v=SQL.100%29.aspx Aviso [ ,...n ].
a CVn 21/03

Respostas:

343

Experimentar:

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 sim, você pode fazer referência à expressão de tabela comum dentro da definição de expressão de tabela comum. Mesmo recursivamente. O que leva a alguns truques muito legais .

Tomek Szpakowicz
fonte
30
Para aqueles que não notaram imediatamente como eu, o problema aqui é adicionar uma vírgula após o original com a instrução .. lol
CRSouser
11
e não escrevendo a palavra withnovamente
user230910 30/04
Oi, isso é equivalente a uma junção cruzada entre duas tabelas. Ou isso cria duas tabelas separadas. Eu não gostaria de cruzar junção de duas tabelas muito grandes, existe uma maneira de criar eficientemente duas tabelas "com" separadas
Long Le
1
@LongLe Não, eles não são equivalentes a junções e não são tabelas. Estes são CTEs - expressões comuns de tabela. Eles são mais parecidos com ... consultas nomeadas que você pode usar como se fossem tabelas ... ou melhor, como visualizações. Por favor, pesquise no Google. Eles são legais. É um dos melhores recursos padrão do SQL, ajudando enormemente a manter as consultas complexas compreensíveis e sob controle.
Tomek Szpakowicz
Para aqueles que não sabem o que são 'expressões comuns de tabela', são 'DependencedIncidents' e 'lalala' no exemplo dado. Para detalhes, consulte docs.microsoft.com/en-us/sql/t-sql/queries/… .
Henry Yang
110

Sim - faça assim:

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

Você não precisa repetir a WITHpalavra - chave

marc_s
fonte
13
O lalala pode usar DependencedIncidents?
Bren 04/04
Os DependencedIncidents podem usar lalala?
Henry Yang
3
@HenryYang: não - o CTE mais tarde ( lalala) pode usar qualquer CTE definido antes - mas o anterior não pode usar uma CTE que só vai ser definido mais tarde ....
marc_s