Чи можу я використовувати кілька "з"?


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

Привіт, це еквівалент перехресного з'єднання між двома таблицями. Або це створює дві окремі таблиці. Я не хотів би перехрещувати приєднання двох дуже великих таблиць, чи є спосіб ефективно створити дві окремі таблиці "з"
Лонг Ле

1
@LongLe Ні, вони не є рівнозначними приєднанням, і вони не є таблицями. Це CTE - загальні табличні вирази. Вони більше схожі на ... названі запити, які ви можете використовувати так, ніби вони були таблицями ... а точніше, більше як перегляди. Будь ласка, google їх. Вони акуратні. Це одна з найкращих стандартних функцій SQL, яка допомагає надзвичайно тримати складні запити зрозумілими та під контролем.
Томек Шпаковіч

Для тих, хто не знає, що таке «загальні вирази таблиць», це «залежність від інцидентів» та «лялала» у наведеному прикладі. Детальніше див. Docs.microsoft.com/en-us/sql/t-sql/queries/… .
Генрі Ян

112

Так - просто зробіть це так:

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

Вам не потрібно повторювати WITHключове слово


13
Чи може лалала використовувати DependencedIncident?
Брен

Чи можуть DependencedIncident використовувати лаля?
Генрі Ян

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