¿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?


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 .


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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.