Могу ли я использовать несколько «с»?


200

Просто для примера:

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
)

... не работает «Ошибка рядом с С».

Кроме того, я хочу использовать первый с внутренним вторым с. Это реально или мне нужно использовать временные таблицы?


1
BOL также имеет точный синтаксис. msdn.microsoft.com/en-us/library/ms175972%28v=SQL.100%29.aspx Уведомление [ ,...n ].
CVn

Ответы:


345

Пытаться:

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
)

И да, вы можете ссылаться на общее табличное выражение внутри определения общего табличного выражения. Даже рекурсивно. Что приводит к некоторым очень аккуратным трюкам .


30
Для тех, кто не сразу заметил это, как я, выгода заключается в добавлении запятой после оригинала с утверждением .. lol
CRSouser

11
и не писать слово withснова
user230910

Привет, это эквивалентно перекрестному соединению между двумя таблицами. Или это создает две отдельные таблицы. Я бы не хотел соединять два очень больших стола, есть ли способ эффективно создать две отдельные таблицы «с»
Long Le

1
@ LongLe Нет, они не эквивалентны объединениям и не являются таблицами. Это CTE - общие табличные выражения. Они больше похожи на ... именованные запросы, которые вы можете использовать, как если бы они были таблицами ... или, скорее, больше похожи на представления. Пожалуйста, гуглите их. Они аккуратны. Это одна из лучших стандартных функций SQL, которая помогает сохранять понятность и контроль сложных запросов.
Томек Шпакович

Для тех, кто не знает, что такое «общие табличные выражения», они являются «DependencedIncidents» и «lalala» в данном примере. Для получения дополнительной информации см. Docs.microsoft.com/en-us/sql/t-sql/queries/… .
Генри Ян

112

Да, просто сделай это так:

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

Вам не нужно повторять WITHключевое слово


13
Может ли lalala использовать DependencedIncidents?
Брен,

Могут ли DependencedIncidents использовать lalala?
Генри Ян

3
Не @HenryYang: нет - позже КТР ( lalala) можно использовать любой КТР определяется до него - но раньше нельзя использовать КТР , который только будет определен позже ....
marc_s
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.