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


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.