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