powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Подзапрос в UNION
36 сообщений из 36, показаны все 2 страниц
Подзапрос в UNION
    #38764866
serg0265
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите возможно ли добавить к результату подзапросов Z0 и Z1 строки, которые суть - результат их группировки по некоторым признакам. Количество и содержание полей воспроизвести - конечно не проблема. А вот итоги...
Полагаю, что это можно сделать с помощью UNION. И вроде бы возникает рекурсия.
Зачем такая заморочка? Потому Z1 долго выполняется и не хочется его запускать второй раз для получения результата группировки.
ЭСКИЗ с неправильным синтаксисом:
Код: sql
1.
2.
3.
4.
5.
(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
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38764869
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serg0265Подскажите возможно ли добавить к результату подзапросов Z0 и Z1 строки, которые суть - результат их группировки по некоторым признакам.
Что мешает попробовать ?
С соблюдением синтаксиса

serg0265А вот итоги...
Изучить WITH ROLLUP
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38764891
serg0265
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Glory,
Сам не пойму, почему-то не принимает интерпретатор SQL Managment Studio 2008. Сейчас Z завернут в функцию одного оператора, к которому добавил приведенный "хвостик", начиная с AS. Без "хвостика" - все Ок проходит.
Вот что вижу (см.вложение) и текст:
"Msg 156, Level 15, State 1, Procedure f_MTR, Line 281
Incorrect syntax near the keyword 'as'."
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38764895
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serg0265И вроде бы возникает рекурсияОткуда ей взяться без рекурсивного CTE?
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38764896
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serg0265Вот что вижу (см.вложение) и текст:
А вы еще поменьше фрагмент кода в скриншоте можете сделать ?
Чтобы интереснее было угадывать
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38764909
serg0265
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Glory,
А вы обратили внимание на количество строк в сообщении об ошибке?
Возможно тогда не предлагали бы выложить всю процедуру здесь.
Или как?
Чего не хватает кроме того, что описано и чтобы составить мнение?
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38764912
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serg0265А вы обратили внимание на количество строк в сообщении об ошибке?
А вы не умеет создавать _тестовые_ запросы ?
Где меньше строк, но соблюдается принцип
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38764914
serg0265
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Glory,
Приходилось.
У вас будут конкретные предложения или будете дальше "мозг компостировать"?
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38764915
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serg0265У вас будут конкретные предложения или будете дальше "мозг компостировать"?
Изучите синтаксис и соблюдайте его.
Или наймите того, кто знает синтаксис и соблюдает его.
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38764917
serg0265
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Glory,
Понятно. "Спасибо" за помощь. Подождем других знатоков.
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38764940
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serg0265Glory,
Понятно. "Спасибо" за помощь. Подождем других знатоков.Код показывайте или идите на форум, где по фотографиям лечат.
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38764945
serg0265
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот как надо оформлять в SQL решение. Может кому пригодится:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38764948
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serg0265, и оно так выполняется быстрее чем два отдельных запроса - с группировкой и без?
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38764952
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serg0265Вот как надо оформлять в SQL решение
Неужели вы справились ?
А когда планируете начать изучение WITH ROLLUP ?
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38764962
serg0265
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Glory,
Напоследок совет: поучитесь хорошим манерам. Особенно когда приходят за помощью. Для этого и предназначен форум.
А то только "воздух портите".
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38764976
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serg0265Напоследок совет: поучитесь хорошим манерам.
А вы что являетесь сертифицированным носителем "хороших манер" ?
Или все, что делаете вы, автоматически считается хорошими манерами ?
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38765006
virtuOS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Glory]serg0265serg0265А вот итоги...
Изучить WITH ROLLUP

Вау, я и не подозревал о таких возможностях. Полтора года работаю с sql, и в подобной ситуации агрегировал либо в отчётной системе, либо через времянки.
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38765012
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет ROLLUP пишут, мол, будет удалена.
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38765021
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовНасчет 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
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38765025
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовНасчет ROLLUP пишут, мол, будет удалена.
Не вижу, что удалят
Вижу "Предложение GROUP BY имеет два синтаксиса: совместимый с ISO и несовместимый с ISO"
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38765033
Фотография daw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GloryВладислав КолосовНасчет ROLLUP пишут, мол, будет удалена.
Не вижу, что удалят
Вижу "Предложение GROUP BY имеет два синтаксиса: совместимый с ISO и несовместимый с ISO"

ниже есть. не-исо предполагают когда-нибудь удалить.
WITH ROLLUP
В будущей версии Microsoft SQL Server эта возможность будет удалена.
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38765038
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dawGloryпропущено...

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

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

Ну так надо просто использовать ISO стандарт.
Результат то тот же будет.
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38765680
serg0265
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Продолжу топик, т.к. выяснилось, что найденное решение - возможно, но не оптимально. Оно не исполняет объявленного в начале требования: "Потому Z1 долго выполняется и не хочется его запускать второй раз для получения результата группировки.".
Так вот сейчас время исполнения объединения в решении умножилось почти в 3 раза. Так понимаю, что из приведенной декларации не следует оптимизация: однократное выполнение "тяжелого" подзапроса и последующее использование результата в остальных компонентах UNION. А следует только декларация, которая тупо подставляется при исполнении, умножая время исполнения исходника.
Вы скажете, используй временную таблицу. Но тогда невозможно будет "завернуть" все в inline функцию, а только multiline. Это в свою очередь неудобно по другой причине: для multiline надо точно декларировать состав, порядок и тип всех полей результата. А сейчас в результате - десятки столбцов, состав и определение которых постоянно меняются. Короче гимор! Потому inline - удобнее.
И вообще, мне не понятно, почему имеет место противоречие в допущениях языка T-SQL: в inline не надо определять результат, а в multiline - обязательно. Почему бы не допустить это для некоторых ситуаций? Так удобнее было бы.
Короче тема и задача остаются открытыми. Есть ли способ остаться "в рамках" inline? Если ли вообще решение при указанных условиях?
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38765684
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serg0265Короче тема и задача остаются открытыми.
Мало того, они остаются вообще неизвестными.
Потому что вы рассказывает про выбранный вами способ решения задачи, а не про саму задачу.
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38765688
serg0265
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну как же нет описания задачи? Вот оно было уже в виде первичного решения:serg0265Вот как надо оформлять в SQL решение. Может кому пригодится:
Код: sql
1.
2.
3.
4.
5.
6.
with Z as
   (select A1, A2, B1 from Z0
   UNION ALL
   select A1, A2, B1 from Z1)
 
   select A1, A2, B1 from Z


Куда уж конкретнее. Вопрос тоже обозначен: можно ли не выполнять Z несколько раз, а использовать результат один раз без временной таблицы?
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38765691
serg0265
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну как же нет описания задачи? Вот оно было уже в виде первичного решения:
serg0265Вот как надо оформлять в SQL решение. Может кому пригодится:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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


Куда уж конкретнее. Вопрос тоже обозначен: можно ли не выполнять Z несколько раз, а использовать результат один раз без временной таблицы?
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38765692
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serg0265Куда уж конкретнее. Вопрос тоже обозначен: можно ли не выполнять Z несколько раз, а использовать результат один раз без временной таблицы?
Ответ тоже конкрентнее некуда - никак.
Только это ответ на выбранный вами способ решения неизвестной задачи.
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38765695
serg0265
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Glory,
Займитесь какими-нибудь другими темами.
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38765696
Фотография StarikNavy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serg0265,

знаете, вы когда к доктору приходите, так же поступаете -
на предложение раздеться, для осмотра, закатываете один рукав, а когда доктор говорит, что в таком случае ему проблематично провести правильную диагностику и назначить лечение, вы ему говорите что он хамло и бездарность?
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38765699
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serg0265Glory,
Займитесь какими-нибудь другими темами.
Помедитируй в одиночестве. Дня три.
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38769959
serg0265
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как только появилась возможность публикую окончательное решение задачи, которое позволяет ускорить первоначальный способ в несколько раз. И которое не требует явного определения для таблицы-результата.
"Принципиальная схема" основана на использовании временных таблиц ## ( а.они позволяют сохранять в них записи без предварительной декларации; б.##, а не # т.к. последние прекращают свое существование после окончания процедуры, а нам нужен результат и после окончания процедуры). Вот схема:
1. Создаем процедуру (не функцию, т.к. последняя для возврата результата требует явной декларации таблицы. И еще важно: в функциях невозможно использование временных таблиц, а в процедурах - допустимо)
2. Исполняем нужный "тяжелый" запрос Z0 и сохраняем его в ##T1 примерно так:
Код: sql
1.
2.
3.
SELECT Z0.* INTO ##Z FROM 
(
SELECT тра-та-та) as Z0


3. Окончательный результат формируем в этой же процедуреи сохраняем в другую временную таблицу примерно так:
Код: sql
1.
2.
3.
4.
5.
6.
                     SELECT Z1.* INTO ##ZZ FROM 
(select A1, A2, B1 from ##Z
UNION ALL
   select A1, NULL, B1 FROM ##Z GROUP BY A1, B1
UNION ALL
   select A1, A2, NULL FROM ##Z GROUP BY A1, A2) AS Z1


4. Удаляем теперь как ненужную первую временную таблицу ##Z:
Код: sql
1.
	drop table ##Z

и завершаем процедуру
5. Теперь ее следует просто вызывать из любого приложения. Например, из свойств внешнего подключения Excel такими образом:
Код: sql
1.
2.
3.
EXEC [Процедура] Параметр1 Параметр2
select * from ##ZZ
drop table ##ZZ


Конечно опущены всякие детали и проверки.
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38769968
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serg0265Конечно опущены всякие детали и проверки.
например, одновременный запуск из двух коннектов
Инитресно будет понаблюдать за их "борьбой" по созданию и удалению общей таблицы.
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38769972
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serg0265, а ROLLUP так и не был осилен или чем-то не устроил?
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38769995
serg0265
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shakill,
Спасибо за предложение. Честно говоря, "руки не дошли" разобраться.
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38770453
serg0265
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shakill,
Вы сподвигли меня проанализировать это решение.
Но конкретно в моем случае оно оказалось неприменимо из-за более сложной логики консолидации подзапросов.
Хотя если бы сложилось, то это решение было бы более изящным.
Решение же с временными таблицами - более универсально.
...
Рейтинг: 0 / 0
Подзапрос в UNION
    #38770462
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serg0265Но конкретно в моем случае оно оказалось неприменимо из-за более сложной логики консолидации подзапросов.
Потому, что вы пребываете в уверенности, что ваш способ единственный для решения задачи. Которую вы держите в секрете
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Подзапрос в UNION
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]