Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 WITH дважды и СТЕ  [new]
Khodiki
Member

Откуда: UFA
Сообщений: 119
Можно ли как-то в запросе дважды использовать WITH и как это сделать. Мне надо сделать СТЕ используя дважды один и тот же запрос, а он длинный. Как это правильно написать. Если бы не было СТЕ я бы написала:
WITH a1 AS
(Select громоздкий)
Select * FROM a1 aa, a2 aa - например

А мне надо сделать
WITH a1 AS
((Select громоздкий)
UNION ALL
SELECT *** FROM a1, (Select громоздкий) WHERE ***)

Как можно написать так, чтобы дважды не переписыва (Select громоздкий)?
26 янв 15, 10:37    [17169094]     Ответить | Цитировать Сообщить модератору
 Re: WITH дважды и СТЕ  [new]
quest_123456
Guest
Khodiki,
Через зпт.
WITH source1 AS (...), source2 AS (...) SELECT * FROM source1, source2
26 янв 15, 10:40    [17169101]     Ответить | Цитировать Сообщить модератору
 Re: WITH дважды и СТЕ  [new]
Glory
Member

Откуда:
Сообщений: 104760
Khodiki
А мне надо сделать
WITH a1 AS
((Select громоздкий)
UNION ALL
SELECT *** FROM a1, (Select громоздкий) WHERE ***)

А зачем нужно делать ?
(Select громоздкий)
UNION ALL
(Select громоздкий)
26 янв 15, 10:51    [17169177]     Ответить | Цитировать Сообщить модератору
 Re: WITH дважды и СТЕ  [new]
Khodiki
Member

Откуда: UFA
Сообщений: 119
Да, спасибо, кажется получится. Все оказывается просто
26 янв 15, 10:52    [17169187]     Ответить | Цитировать Сообщить модератору
 Re: WITH дважды и СТЕ  [new]
Khodiki
Member

Откуда: UFA
Сообщений: 119
quest_123456, спасибо.

Glory
вижу решение только так
26 янв 15, 10:54    [17169193]     Ответить | Цитировать Сообщить модератору
 Re: WITH дважды и СТЕ  [new]
Glory
Member

Откуда:
Сообщений: 104760
Khodiki
Glory
вижу решение только так

Если вы видите только так, то не значит, что такое решение единственное
26 янв 15, 10:56    [17169215]     Ответить | Цитировать Сообщить модератору
 Re: WITH дважды и СТЕ  [new]
Khodiki
Member

Откуда: UFA
Сообщений: 119
Glory

Да, наверное. но по условию задачи я сначала должна решить, а потом посмотреть как другие решают.
Поэтому пока мне информации достаточно
26 янв 15, 10:59    [17169235]     Ответить | Цитировать Сообщить модератору
 Re: WITH дважды и СТЕ  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Если (Select громоздкий) одинаков везде в UNIONе,
то нужно вовсе не так, а просто в SELECTах UNIONа
обратиться к CTE дважды с разными алиасами.
А не создавать два одинаковых CTE через запятую.
26 янв 15, 11:22    [17169386]     Ответить | Цитировать Сообщить модератору
 Re: WITH дважды и СТЕ  [new]
Khodiki
Member

Откуда: UFA
Сообщений: 119
iap,

Я и не делаю два одинаковых сте через запятую
А делаю типа

With a1 AS(,большой запрос), a2 AS (Select * FROM a1 WHERE ***
UNION ALL
Select * FROM a1, a2 WHERE)
Select * FROM a2 **
26 янв 15, 11:52    [17169579]     Ответить | Цитировать Сообщить модератору
 Re: WITH дважды и СТЕ  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Khodiki
iap,

Я и не делаю два одинаковых сте через запятую
А делаю типа

With a1 AS(,большой запрос), a2 AS (Select * FROM a1 WHERE ***
UNION ALL
Select * FROM a1, a2 WHERE)
Select * FROM a2 **
А почему сразу не SELECT ... UNION ALL SELECT ... ?
Зачем второе CTE?

И перестаньте писать во FROM запятую! :)
26 янв 15, 11:56    [17169609]     Ответить | Цитировать Сообщить модератору
 Re: WITH дважды и СТЕ  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
iap
Khodiki
iap,

Я и не делаю два одинаковых сте через запятую
А делаю типа

With a1 AS(,большой запрос), a2 AS (Select * FROM a1 WHERE ***
UNION ALL
Select * FROM a1, a2 WHERE)
Select * FROM a2 **
А почему сразу не SELECT ... UNION ALL SELECT ... ?
Зачем второе CTE?

И перестаньте писать во FROM запятую! :)
Аааа! Так у Вас же рекурсивное CTE!
Поздравляю. Расскажете потом о скорости выполнения.
Если не ошибаюсь, a1 будет выполняться на каждый шаг рекурсии?
Надеюсь, товарищи поправят, если я неправ.
26 янв 15, 12:00    [17169633]     Ответить | Цитировать Сообщить модератору
 Re: WITH дважды и СТЕ  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Скорее всего, надо SELECT из первого CTE выполнить отдельно, а результат сохранить во временной таблице.
Определить в этой таблице индексы для последующего запроса, все дела...
А уж потом - рекурсивный запрос.

Что-то мне подсказывает, что это будет выполняться быстрее
26 янв 15, 12:05    [17169689]     Ответить | Цитировать Сообщить модератору
 Re: WITH дважды и СТЕ  [new]
Khodiki
Member

Откуда: UFA
Сообщений: 119
iap,пока вроде ещё нормально по скорости, но я до конца не написала
Но запятую я сдесь правильно ставлю - это не алиас

With a1 AS(,большой запрос), a2 AS (Select * FROM a1 WHERE ***
UNION ALL
Select * FROM a1, a2 WHERE) - так мне надо
Select * FROM a2 **

У меня получаетс в СТЕ используются две таблицы
26 янв 15, 12:47    [17170139]     Ответить | Цитировать Сообщить модератору
 Re: WITH дважды и СТЕ  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Khodiki,

там не две таблицы, а одна таблица и само же это CTE (a2).
Это называется "рекурсивное CTE". Так и надо? Хорошо.

Вместо запятой крайне желательно применять JOIN.
В рекурсивной части CTE допустимы CROSS JOIN (как у Вас)
и INNER JOIN (INNER можно не писать).
26 янв 15, 12:53    [17170178]     Ответить | Цитировать Сообщить модератору
 Re: WITH дважды и СТЕ  [new]
joiner123
Guest
iap
Вместо запятой крайне желательно применять JOIN.

iap
Вопрос не по теме
В 2012 запятые можно применять в качестве "соединения", а в 2014? Вообще когда(c какой версии) MS перестанет поддерживать join через запятые ?
26 янв 15, 12:58    [17170228]     Ответить | Цитировать Сообщить модератору
 Re: WITH дважды и СТЕ  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
joiner123
iap
Вместо запятой крайне желательно применять JOIN.

iap
Вопрос не по теме
В 2012 запятые можно применять в качестве "соединения", а в 2014? Вообще когда(c какой версии) MS перестанет поддерживать join через запятые ?
Пока неизвестно.

Запятая - ANSI SQL-89
JOIN - ANSI SQL-92

Запятая - очень убога по функциональности.
Например, начиная с SQL2005, Вы ни за что не реализуете LEFT/RIGHT/FULL JOIN через запятую.
Два эти синтаксиса смешивать в одном SELECTе крайне не рекомендуется.
26 янв 15, 13:03    [17170270]     Ответить | Цитировать Сообщить модератору
 Re: WITH дважды и СТЕ  [new]
joiner123
Guest
Понял спасибо!
26 янв 15, 13:04    [17170282]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить