Например:

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
)

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

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

303
cnd 21 Мар 2011 в 12:13
1
BOL также имеет точный синтаксис. msdn.microsoft.com/en-us/ library / ms175972% 28v = SQL.100% 29.aspx Примечание [ ,...n ].
 – 
user
21 Мар 2011 в 12:22

2 ответа

Лучший ответ

Пытаться:

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
)

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

511
Tomek Szpakowicz 21 Мар 2011 в 12:21
77
Для тех, кто не сразу заметил это, как я, уловка здесь в том, чтобы добавить запятую после оригинального оператора with .. lol
 – 
CRSouser
24 Сен 2017 в 18:35
49
И больше не писать слово with
 – 
user230910
1 Май 2018 в 01:30
Привет, это эквивалент перекрестного соединения двух таблиц. Или это создает две отдельные таблицы. Я бы не хотел перекрестно объединять две очень большие таблицы, есть ли способ эффективно создать две отдельные таблицы "с"
 – 
Long Le
6 Дек 2018 в 04:25
2
Нет, они не эквивалентны объединениям и не являются таблицами. Это CTE - общие табличные выражения. Они больше похожи на ... именованные запросы, которые вы можете использовать, как если бы они были таблицами ... или, скорее, более похожими на представления. Пожалуйста, погуглите их. Они аккуратные. Это одна из лучших стандартных функций SQL, чрезвычайно помогающая держать сложные запросы понятными и под контролем.
 – 
Tomek Szpakowicz
6 Дек 2018 в 23:46
Для тех, кто не знает, что такое «общие табличные выражения», в данном примере это «Зависимость» и «лалала». Подробнее см. docs.microsoft.com/en-us/sql/t-sql/queries/… .
 – 
Henry Yang
3 Июн 2019 в 02:34

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

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

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

172
ivan_pozdeev 24 Ноя 2015 в 22:57
20
Может ли лалала использовать DependencedIncidents?
 – 
Bren
5 Апр 2016 в 02:58
1
Могут ли DependencedIncidents использовать лалалу?
 – 
Henry Yang
3 Июн 2019 в 02:35
8
@HenryYang: нет - более поздний CTE (lalala) может использовать любой CTE, определенный до него, но более ранний не может использовать CTE, который будет определен позже ....
 – 
marc_s
3 Июн 2019 в 06:43