¿Puedo usar múltiples "con"?

199

Solo por ejemplo:

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
)

... no funciona "Error cerca de con".

Además, quiero usar primero con dentro de segundo con. ¿Es real o necesito usar tablas temporales?

cnd
fuente
1
BOL también tiene la sintaxis exacta. msdn.microsoft.com/en-us/library/ms175972%28v=SQL.100%29.aspx Aviso [ ,...n ].
un CVn

Respuestas:

343

Tratar:

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
)

Y sí, puede hacer referencia a la expresión de tabla común dentro de la definición de expresión de tabla común. Incluso recursivamente. Lo que lleva a algunos trucos muy buenos .

Tomek Szpakowicz
fuente
30
Para aquellos que no lo notaron de inmediato como yo, la trampa aquí es agregar una coma después del original con una declaración ... jajaja
CRSouser
11
y no withvolver a escribir la palabra
usuario230910
Hola, ¿esto es equivalente a una unión cruzada entre dos tablas? ¿O esto crea dos tablas separadas? No me gustaría unir dos tablas muy grandes, ¿hay alguna manera de crear eficientemente dos tablas "con" separadas
Long Le
1
@LongLe No, no son equivalentes a uniones y no son tablas. Estos son CTE: expresiones de tabla comunes. Son más como ... consultas con nombre que puedes usar como si fueran tablas ... o más bien como vistas. Por favor, googlearlos. Son aseados. Es una de las mejores características estándar de SQL, que ayuda enormemente a mantener consultas complejas comprensibles y bajo control.
Tomek Szpakowicz
Para aquellos que no saben qué son las 'expresiones de tabla comunes', son 'Incidentes dependientes' y 'lalala' en el ejemplo dado. Para más detalles, consulte docs.microsoft.com/en-us/sql/t-sql/queries/… .
Henry Yang
110

Sí, solo hazlo de esta manera:

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

No necesita repetir la WITHpalabra clave

marc_s
fuente
13
¿Puede lalala usar incidentes dependientes?
Bren
¿Pueden los incidentes dependientes usar lalala?
Henry Yang
3
@HenryYang: no - la tarde CTE ( lalala) se puede utilizar cualquier CTE define con anterioridad a ella - pero el anterior no se puede utilizar un CET que sólo va a ser definida más adelante ....
marc_s