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

Откуда:
Сообщений: 165
Подскажите возможно ли добавить к результату подзапросов Z0 и Z1 строки, которые суть - результат их группировки по некоторым признакам. Количество и содержание полей воспроизвести - конечно не проблема. А вот итоги...
Полагаю, что это можно сделать с помощью UNION. И вроде бы возникает рекурсия.
Зачем такая заморочка? Потому Z1 долго выполняется и не хочется его запускать второй раз для получения результата группировки.
ЭСКИЗ с неправильным синтаксисом:
(select A1, A2, B1 from Z0
UNION ALL
select A1, A2, B1 from Z1) AS Z --- Здесь на самом деле большой запрос, который долго выполняется.
UNION ALL
select A1, NULL, B1 from Z GROUP BY A1, B1
2 окт 14, 14:22    [16650492]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
Glory
Member

Откуда:
Сообщений: 104751
serg0265
Подскажите возможно ли добавить к результату подзапросов Z0 и Z1 строки, которые суть - результат их группировки по некоторым признакам.

Что мешает попробовать ?
С соблюдением синтаксиса

serg0265
А вот итоги...

Изучить WITH ROLLUP
2 окт 14, 14:24    [16650506]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
serg0265
Member

Откуда:
Сообщений: 165
Glory,
Сам не пойму, почему-то не принимает интерпретатор SQL Managment Studio 2008. Сейчас Z завернут в функцию одного оператора, к которому добавил приведенный "хвостик", начиная с AS. Без "хвостика" - все Ок проходит.
Вот что вижу (см.вложение) и текст:
"Msg 156, Level 15, State 1, Procedure f_MTR, Line 281
Incorrect syntax near the keyword 'as'."

К сообщению приложен файл. Размер - 3Kb
2 окт 14, 14:34    [16650583]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
serg0265
И вроде бы возникает рекурсия
Откуда ей взяться без рекурсивного CTE?
2 окт 14, 14:35    [16650593]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
Glory
Member

Откуда:
Сообщений: 104751
serg0265
Вот что вижу (см.вложение) и текст:

А вы еще поменьше фрагмент кода в скриншоте можете сделать ?
Чтобы интереснее было угадывать
2 окт 14, 14:35    [16650595]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
serg0265
Member

Откуда:
Сообщений: 165
Glory,
А вы обратили внимание на количество строк в сообщении об ошибке?
Возможно тогда не предлагали бы выложить всю процедуру здесь.
Или как?
Чего не хватает кроме того, что описано и чтобы составить мнение?
2 окт 14, 14:40    [16650637]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
Glory
Member

Откуда:
Сообщений: 104751
serg0265
А вы обратили внимание на количество строк в сообщении об ошибке?

А вы не умеет создавать _тестовые_ запросы ?
Где меньше строк, но соблюдается принцип
2 окт 14, 14:41    [16650646]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
serg0265
Member

Откуда:
Сообщений: 165
Glory,
Приходилось.
У вас будут конкретные предложения или будете дальше "мозг компостировать"?
2 окт 14, 14:43    [16650658]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
Glory
Member

Откуда:
Сообщений: 104751
serg0265
У вас будут конкретные предложения или будете дальше "мозг компостировать"?

Изучите синтаксис и соблюдайте его.
Или наймите того, кто знает синтаксис и соблюдает его.
2 окт 14, 14:45    [16650671]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
serg0265
Member

Откуда:
Сообщений: 165
Glory,
Понятно. "Спасибо" за помощь. Подождем других знатоков.
2 окт 14, 14:45    [16650682]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
serg0265
Glory,
Понятно. "Спасибо" за помощь. Подождем других знатоков.
Код показывайте или идите на форум, где по фотографиям лечат.
2 окт 14, 14:57    [16650773]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
serg0265
Member

Откуда:
Сообщений: 165
Вот как надо оформлять в SQL решение. Может кому пригодится:
with Z as
   (select A1, A2, B1 from Z0
   UNION ALL
   select A1, A2, B1 from Z1)
 
   select A1, A2, B1 from Z
UNION ALL
   select A1, NULL, B1 FROM Z GROUP BY A1, B1
2 окт 14, 15:00    [16650797]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
serg0265, и оно так выполняется быстрее чем два отдельных запроса - с группировкой и без?
2 окт 14, 15:01    [16650810]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
Glory
Member

Откуда:
Сообщений: 104751
serg0265
Вот как надо оформлять в SQL решение

Неужели вы справились ?
А когда планируете начать изучение WITH ROLLUP ?
2 окт 14, 15:02    [16650818]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
serg0265
Member

Откуда:
Сообщений: 165
Glory,
Напоследок совет: поучитесь хорошим манерам. Особенно когда приходят за помощью. Для этого и предназначен форум.
А то только "воздух портите".
2 окт 14, 15:07    [16650858]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
Glory
Member

Откуда:
Сообщений: 104751
serg0265
Напоследок совет: поучитесь хорошим манерам.

А вы что являетесь сертифицированным носителем "хороших манер" ?
Или все, что делаете вы, автоматически считается хорошими манерами ?
2 окт 14, 15:10    [16650890]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
[quot Glory]
serg0265
serg0265
А вот итоги...

Изучить WITH ROLLUP


Вау, я и не подозревал о таких возможностях. Полтора года работаю с sql, и в подобной ситуации агрегировал либо в отчётной системе, либо через времянки.
2 окт 14, 15:32    [16651056]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8833
Насчет ROLLUP пишут, мол, будет удалена.
2 окт 14, 15:39    [16651108]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Владислав Колосов
Насчет ROLLUP пишут, мол, будет удалена.
Зато
GROUP BY (Transact-SQL)
<grouping set item> ::=
<simple group by item>
| <rollup spec>
| <cube spec>

<grouping set item list> ::=
<grouping set item> [ ,...n ]

Non-ISO-Compliant Syntax
[ GROUP BY [ ALL ] group_by_expression [ ,...n ]
[ WITH { CUBE | ROLLUP } ]
]
http://msdn.microsoft.com/ru-ru/library/ms177673(v=sql.100).aspx
2 окт 14, 15:44    [16651158]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
Glory
Member

Откуда:
Сообщений: 104751
Владислав Колосов
Насчет ROLLUP пишут, мол, будет удалена.

Не вижу, что удалят
Вижу "Предложение GROUP BY имеет два синтаксиса: совместимый с ISO и несовместимый с ISO"
2 окт 14, 15:47    [16651179]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Glory
Владислав Колосов
Насчет ROLLUP пишут, мол, будет удалена.

Не вижу, что удалят
Вижу "Предложение GROUP BY имеет два синтаксиса: совместимый с ISO и несовместимый с ISO"


ниже есть. не-исо предполагают когда-нибудь удалить.
WITH ROLLUP
В будущей версии Microsoft SQL Server эта возможность будет удалена.
2 окт 14, 15:52    [16651232]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
Glory
Member

Откуда:
Сообщений: 104751
daw
Glory
пропущено...

Не вижу, что удалят
Вижу "Предложение GROUP BY имеет два синтаксиса: совместимый с ISO и несовместимый с ISO"


ниже есть. не-исо предполагают когда-нибудь удалить.
WITH ROLLUP
В будущей версии Microsoft SQL Server эта возможность будет удалена.

Ну так надо просто использовать ISO стандарт.
Результат то тот же будет.
2 окт 14, 15:55    [16651260]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
serg0265
Member

Откуда:
Сообщений: 165
Продолжу топик, т.к. выяснилось, что найденное решение - возможно, но не оптимально. Оно не исполняет объявленного в начале требования: "Потому Z1 долго выполняется и не хочется его запускать второй раз для получения результата группировки.".
Так вот сейчас время исполнения объединения в решении умножилось почти в 3 раза. Так понимаю, что из приведенной декларации не следует оптимизация: однократное выполнение "тяжелого" подзапроса и последующее использование результата в остальных компонентах UNION. А следует только декларация, которая тупо подставляется при исполнении, умножая время исполнения исходника.
Вы скажете, используй временную таблицу. Но тогда невозможно будет "завернуть" все в inline функцию, а только multiline. Это в свою очередь неудобно по другой причине: для multiline надо точно декларировать состав, порядок и тип всех полей результата. А сейчас в результате - десятки столбцов, состав и определение которых постоянно меняются. Короче гимор! Потому inline - удобнее.
И вообще, мне не понятно, почему имеет место противоречие в допущениях языка T-SQL: в inline не надо определять результат, а в multiline - обязательно. Почему бы не допустить это для некоторых ситуаций? Так удобнее было бы.
Короче тема и задача остаются открытыми. Есть ли способ остаться "в рамках" inline? Если ли вообще решение при указанных условиях?
3 окт 14, 10:27    [16654489]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
Glory
Member

Откуда:
Сообщений: 104751
serg0265
Короче тема и задача остаются открытыми.

Мало того, они остаются вообще неизвестными.
Потому что вы рассказывает про выбранный вами способ решения задачи, а не про саму задачу.
3 окт 14, 10:29    [16654504]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос в UNION  [new]
serg0265
Member

Откуда:
Сообщений: 165
Ну как же нет описания задачи? Вот оно было уже в виде первичного решения:
serg0265
Вот как надо оформлять в SQL решение. Может кому пригодится:
with Z as
   (select A1, A2, B1 from Z0
   UNION ALL
   select A1, A2, B1 from Z1)
 
   select A1, A2, B1 from Z

Куда уж конкретнее. Вопрос тоже обозначен: можно ли не выполнять Z несколько раз, а использовать результат один раз без временной таблицы?
3 окт 14, 10:34    [16654544]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить