powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Union вопрос к разработчикам
25 сообщений из 43, страница 1 из 2
Union вопрос к разработчикам
    #38919896
Евгений Болтик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут дурная мысль пришла и полез в очередной раз искать варианты в Интернете.
Увидел https://ru.wikipedia.org/wiki/Union_(SQL)

увидел то что мне надо

Код: plsql
1.
2.
3.
(SELECT person, amount FROM sales2005 WHERE amount=1000)
UNION
(SELECT person, amount FROM sales2005 WHERE person LIKE 'Сергей')


но такое не прокатывает силекты в скобках сервер не понял

Если были бы скобочки поддерживались, то можно было бы сортировку для каждого запроса указать на данный момент это мне надо. Хотя я уже не раз SELECT ... FROM (SELECT person, amount FROM) городил

Что по скобочкам говорит стандарт? А то может тот кто писал статью не знает об этом и я рано обрадовался.
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38919911
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений БолтикЕсли были бы скобочки поддерживались, то можно было бы сортировку для каждого запроса указать
про взаимосвязь скобочек и отдельной сортировки ты сам придумал?
и мне тоже интересно, какой сервер в твоей ссылке для union поддерживает скобки.
Order by по стандарту сортирует конечное множество результата запроса.
Хочешь странные сортировки - пиши селективную процедуру, и там ставь запросы и сортировку в них в любом порядке.
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38919918
Евгений Болтик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvЕвгений БолтикЕсли были бы скобочки поддерживались, то можно было бы сортировку для каждого запроса указать
про взаимосвязь скобочек и отдельной сортировки ты сам придумал?
и мне тоже интересно, какой сервер в твоей ссылке для union поддерживает скобки.
Order by по стандарту сортирует конечное множество результата запроса.
Хочешь странные сортировки - пиши селективную процедуру, и там ставь запросы и сортировку в них в любом порядке.

Не понял вопроса, наверно туповато описал ситуацию. Я имел ввиду, что тогда есть возможность написать без хранимых процедур и заморочек:
Код: plsql
1.
2.
3.
(SELECT person, amount FROM sales2005 WHERE amount=1000 order by person)
UNION
(SELECT first 1 person, amount FROM sales2005 WHERE person LIKE 'Сергей'  order by person desc)



просто стало действительно интересно, неужели в стандарте есть скобочки. Тогда это могло бы дать возможность переписать по другому, с более простым видом.
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38919929
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений Болтик,

да я понял. только скобочки, даже если бы и были, тебе не помогут. ну не делают order by у разных частей union, что со скобочками, что без.
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38919940
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений Болтик> Хотя я уже не раз SELECT ... FROM (SELECT person, amount FROM) городил

Так а в чём проблема тогда, лень лишний Select написать ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38919986
Евгений Болтик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамЕвгений Болтик> Хотя я уже не раз SELECT ... FROM (SELECT person, amount FROM) городил

Так а в чём проблема тогда, лень лишний Select написать ?


Что ж вы так снова на меня. Лично я ничего нового не предложил я просто процитировал увиденное. По началу помнится SELECT ... FROM (SELECT FROM) тоже не хотели городить, но потом как то раз и написали. using тоже не было и т.д.

Читабельность проще. Просто если скобки есть, то это должно говорить о том, что можно с городить огород который я описал т.к. order by или group by тогда допустим внутри.

Странно только почему не расширить возможности. Вы сразу идею в топку. Я и без этого понимаю, что можно к верх ногами делать и без нововведений. Что и делаю уже не первый год.
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38920029
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений БолтикВы сразу идею в топку.
ради интереса
1. найди и приведи тут сервер, в котором вот такой синтаксис union, со скобками.
2. найди и приведи тут сервер, в котором в обоих частях union можно указывать order by (таким образом, как ты хочешь).
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38920088
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений Болтик> Что ж вы так снова на меня. Вы сразу идею в топку.

Во-первых, лично я не снова, первый раз вроде.
Во-вторых, не в топку, это Дима на тебя накинулся.
Идея как идея, но в текущем изложении (синтаксисе)
противоречит стандарту, и как её "облегчить" лично
я не вижу. При чём не только из-за скобочек, IIRC.

> Читабельность проще.

Это да, не спорю. Но по сути там экономия только на
"Select *" ради синтаксического сахара. Хотя в свете
последних веяний я ничему особо не удивлюсь.

P.S. Раньше такое делали доп.полем, если сортировка
не разнонаправленная.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38920119
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам это Дима на тебя накинулся.
я не накинулся, просто у меня от таких хотелок становится кислое выражение лица.

кстати, интересно, можно ли было бы сымитировать такую штуку с ClientDataSet. То есть, сначала загнать в него результат одного запроса, а потом добавить результат второго?

И еще. Идеологически, допустим, если бы такая фича (сортировка каждого запроса union) была, она имела бы смысл только для UNION ALL. Потому что просто UNION выкидывает повторы. И если повторы есть, то при раздельной сортировке откуда тогда их выкидывать? Из первого или второго объединяемых наборов? И в итоге получилось бы натуральное "рыбу заворачиваем" - если это union all, то все ок; если это union, то не допускаем несколько order by; если в union all только один order by, то сортируем все, а если в union all несколько order by, то не сортируем результат...
Мешанина.
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38920125
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

Вы полностью описали, как я хотел бы это видеть :)
имхо все логично и очевидно
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38920133
Евгений Болтик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvЕвгений БолтикВы сразу идею в топку.
ради интереса
1. найди и приведи тут сервер, в котором вот такой синтаксис union, со скобками.
2. найди и приведи тут сервер, в котором в обоих частях union можно указывать order by (таким образом, как ты хочешь).

Начал поиск. Попал сюда
http://www.cyberforum.ru/sql-server/thread847220.html

далее окромя того кто создал это я не могу идти. Иду к создателю зверя
https://msdn.microsoft.com/ru-ru/library/ms180026.aspx
Код: sql
1.
2.
3.
4.
5.
 { <query_specification> | ( <query_expression> ) } 
  UNION [ ALL ] 
  <query_specification | ( <query_expression> ) 
 [ UNION [ ALL ] <query_specification> | ( <query_expression> ) 
    [ ...n ] ] 



начинает интересовать query_expression

https://msdn.microsoft.com/ru-ru/library/ms189499.aspx
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<SELECT statement> ::=  
    [WITH <common_table_expression> [,...n]]
    <query_expression> 
    [ ORDER BY { order_by_expression | column_position [ ASC | DESC ] } 
  [ ,...n ] ] 
    [ <FOR Clause>] 
    [ OPTION ( <query_hint> [ ,...n ] ) ] 
<query_expression> ::= 
    { <query_specification> | ( <query_expression> ) } 
    [  { UNION [ ALL ] | EXCEPT | INTERSECT }
        <query_specification> | ( <query_expression> ) [...n ] ] 
<query_specification> ::= 
SELECT [ ALL | DISTINCT ] 
    [TOP ( expression ) [PERCENT] [ WITH TIES ] ] 
    < select_list > 
    [ INTO new_table ] 
    [ FROM { <table_source> } [ ,...n ] ] 
    [ WHERE <search_condition> ] 
    [ <GROUP BY> ] 
    [ HAVING < search_condition > ] 



нашли искомое оно выражается как
Код: sql
1.
2.
3.
4.
<query_expression> ::= 
    { <query_specification> | ( <query_expression> ) } 
    [  { UNION [ ALL ] | EXCEPT | INTERSECT }
        <query_specification> | ( <query_expression> ) [...n ] ] 



обрати внимание <query_specification> не допускает сортировок
а вот <query_expression> это и есть обычный SELECT со всеми вытекающими

посему вывод раз могут быть вложенные union то законно может быть такой запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
(SELECT person, amount FROM sales2005 WHERE amount=1000)
UNION
select first 1 ... from (
    (SELECT person, amount FROM sales2005 WHERE amount=1000)
    UNION
    (SELECT person, amount FROM sales2005 WHERE person LIKE 'Сергей')
  order by 1)
)
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38920135
na-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
na-
Гость
kdvЕвгений БолтикВы сразу идею в топку.
ради интереса
1. найди и приведи тут сервер, в котором вот такой синтаксис union, со скобками.
2. найди и приведи тут сервер, в котором в обоих частях union можно указывать order by (таким образом, как ты хочешь).
Возможно Firebird будет первым, кто реализует этот удобный и всем понятный синтаксис. Потом подтянутся другие срвера. А потом и в стандарте пропишут.
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38920146
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений Болтикобрати внимание <query_specification> не допускает сортировок
а вот <query_expression> это и есть обычный SELECT со всеми вытекающими
Да ну? У тебя и с чтением плохо?..

Код: sql
1.
2.
<query_expression> ::=
     { <query_specification> | ( <query_expression> ) } 


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38920147
Евгений Болтик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамЕвгений Болтик> Что ж вы так снова на меня. Вы сразу идею в топку.

Во-первых, лично я не снова, первый раз вроде.
Во-вторых, не в топку, это Дима на тебя накинулся.
Идея как идея, но в текущем изложении (синтаксисе)
противоречит стандарту, и как её "облегчить" лично
я не вижу. При чём не только из-за скобочек, IIRC.

> Читабельность проще.

Это да, не спорю. Но по сути там экономия только на
"Select *" ради синтаксического сахара. Хотя в свете
последних веяний я ничему особо не удивлюсь.

P.S. Раньше такое делали доп.полем, если сортировка
не разнонаправленная.


Еще есть одна проблема, если ты с таким мало сталкивался, то кол-во контекстов иногда зашкаливает и разбить как то надо на 2 тела. Вот тут и начинаешь танец в бубном. Дополнительные поля в таблицу и триггеры один за другим по определенной логике работы с повторами чтений данных которые вроде как в первом триггере делал (жаль переменные для триггеров у таблицы не могут быть общие, на изменение одной записи.). Я уже смерился с двойным чтением.
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38920152
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
na-будет первым, кто реализует этот удобный и всем понятный синтаксис.
а мне кажется что это чешуя, а не "понятный синтаксис", и нарушение стандарта. Я знаю, что отклонения от стандарта допускаются, но...

хочу реальный пример (прикладной) вывода
select order by
union all
select order by
где результаты отсортированы отдельно.

p.s. подозреваю, что пример будет похож на
Код: sql
1.
2.
3.
select A, B
from ...
ORDER BY C


то есть когда хрен поймешь, по какому критерию это все отсортировано.
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38920155
Евгений Болтик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЕвгений Болтикобрати внимание <query_specification> не допускает сортировок
а вот <query_expression> это и есть обычный SELECT со всеми вытекающими
Да ну? У тебя и с чтением плохо?..

Код: sql
1.
2.
<query_expression> ::=
     { <query_specification> | ( <query_expression> ) } 




Естественно я это видел, я долго тупил и перечитывал не понимая, а что же они все таки этим считали. В инете смотрел примеры и сравнивал с описанным в MS.
Но смыл заключается в том, что человек запускал похожий запрос.

Вот еще, но там я так понял человек не учел, что desc вернет записи в обратном порядке, во втором подзапросе:
http://forum.sources.ru/index.php?showtopic=136262
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38920157
Евгений Болтик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvna-будет первым, кто реализует этот удобный и всем понятный синтаксис.
а мне кажется что это чешуя, а не "понятный синтаксис", и нарушение стандарта. Я знаю, что отклонения от стандарта допускаются, но...

хочу реальный пример (прикладной) вывода
select order by
union all
select order by
где результаты отсортированы отдельно.

p.s. подозреваю, что пример будет похож на
Код: sql
1.
2.
3.
select A, B
from ...
ORDER BY C


то есть когда хрен поймешь, по какому критерию это все отсортировано.

Тока не надо критики. Я просто экспериментировал мне надо было результат получить и по ошибке применил такую схему из другого запроса.

Но там действительно выборки были с обратной сортировкой и все записи которые будут удовлетворять. Тут оказалось нужна одна запись и это решилось через coalesce.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
select WI_Shops_ID, coalesce(FindContr_ID, Contr_ID) as Contr_ID, cast(DateFrom as date) as DateFrom,
count(*) as all_count, 
sum(iif(b_IsBit(Flags, 2) = 1 and b_IsBit(Flags, 10) = 0, 1, 0)) as new_count, 
sum(iif(b_IsBit(Flags, 4) = 1, 1, 0)) as old_count, 
sum(iif(b_IsBit(Flags, 6) = 1, 1, 0)) as find_count,
min((
  select first 1 ValueData from 
  (
  select ValueData from (select ValueData from Banker_Price where TypeID = 2 and DateFrom <= H.DateFrom and 
    WI_Shops.Banker_ID = Banker_ID and Seller_ID = WI_Shops.Seller_ID and SellerAddr_ID = WI_Shops.SellerAddr_ID
    order by Banker_ID desc, Seller_ID desc, SellerAddr_ID desc, TypeID desc, DateFrom desc)
    group by 1     
  union all
  select ValueData from (select ValueData from Banker_Price where TypeID = 2 and DateFrom <= H.DateFrom and
    WI_Shops.Banker_ID = Banker_ID and Seller_ID = WI_Shops.Seller_ID and SellerAddr_ID is null
    order by Banker_ID desc, Seller_ID desc, SellerAddr_ID desc, TypeID desc, DateFrom desc)     
  union all
  select ValueData from (select ValueData from Banker_Price where TypeID = 2 and DateFrom <= H.DateFrom and
    WI_Shops.Banker_ID = Banker_ID and Seller_ID is null and SellerAddr_ID is null
    order by Banker_ID desc, Seller_ID desc, SellerAddr_ID desc, TypeID desc, DateFrom desc)     
  ) )) as Price01,
min((select first 1 ValueData from 
  (select ValueData from (select ValueData from Banker_Price where TypeID = 3 and DateFrom <= H.DateFrom and
    WI_Shops.Banker_ID = Banker_ID and Seller_ID = WI_Shops.Seller_ID and SellerAddr_ID =WI_Shops.SellerAddr_ID
    order by Banker_ID desc, Seller_ID desc, SellerAddr_ID desc, TypeID desc, DateFrom desc)     
  union all
  select ValueData from (select ValueData from Banker_Price where TypeID = 3 and DateFrom <= H.DateFrom and
    WI_Shops.Banker_ID = Banker_ID and Seller_ID = WI_Shops.Seller_ID and SellerAddr_ID is null
    order by Banker_ID desc, Seller_ID desc, SellerAddr_ID desc, TypeID desc, DateFrom desc)     
  union all
  select ValueData from (select ValueData from Banker_Price where TypeID = 3 and DateFrom <= H.DateFrom and
    WI_Shops.Banker_ID = Banker_ID and Seller_ID is null and SellerAddr_ID is null
    order by Banker_ID desc, Seller_ID desc, SellerAddr_ID desc, TypeID desc, DateFrom desc)     
  ) )) as Price02
from H_Req H, WI_Shops where H.WI_Shops_ID = WI_Shops.ID 
group by 1, 2, 3
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38920165
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvхочу реальный пример (прикладной) вывода
select order by
union all
select order by
Пожалуйста. Регулярно надо:

Код: sql
1.
2.
3.
SELECT 0 AS ID, '(Все)' AS NAME FROM RDB$DATABASE
UNION ALL
SELECT ID, NAME FROM <TABLE> --ORDER BY ID. Все ID положительные



Сейчас приходится делать так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT
  DATA.ID,
  DATA.NAME
FROM
(SELECT 0 AS ID, '(Все)' AS NAME FROM RDB$DATABASE
UNION ALL
SELECT ID, NAME FROM <TABLE>
) DATA
ORDER BY DATA.ID


много лишней писанины
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38920173
na-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
na-
Гость
YuRockkdvхочу реальный пример (прикладной) вывода
select order by
union all
select order by
Пожалуйста. Регулярно надо:

Код: sql
1.
2.
3.
SELECT 0 AS ID, '(Все)' AS NAME FROM RDB$DATABASE
UNION ALL
SELECT ID, NAME FROM <TABLE> --ORDER BY ID. Все ID положительные


Вот так будет ещё жизненней:
Код: sql
1.
2.
3.
(SELECT 0 AS ID, '(Все)' AS NAME FROM RDB$DATABASE)
UNION ALL
(SELECT ID, NAME FROM <TABLE> ORDER BY NAME)
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38920174
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

а ты не пробовал так и написать ???

Код: sql
1.
2.
3.
4.
SELECT 0 AS ID, '(Все)' AS NAME FROM RDB$DATABASE
UNION ALL
SELECT ID, NAME FROM <TABLE> 
ORDER BY ID
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38920176
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladа ты не пробовал так и написать ???
Пробовал. invalid ORDER BY clause получал.

Возможно, будь у меня сервер поновее, там бы это и можно было сделать. Но все равно это не идеально - обязательно сортировать весь результат. Вдруг мне надо только половину? Например, "Закрепленные" строки, и все остальные
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38920183
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockПробовал. invalid ORDER BY clause получал.order by 1

YuRockНо все равно это не идеально - обязательно сортировать весь результат.Обеспечь соответствующее условие сортировки. Тыжпрограммист, ы ?
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38920185
Евгений Болтик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladYuRock,

а ты не пробовал так и написать ???

SELECT 0 AS ID, '(Все)' AS NAME FROM RDB$DATABASE
UNION ALL
SELECT ID, NAME FROM <TABLE>
ORDER BY ID

К тебе письма дошли?
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38920186
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений БолтикК тебе письма дошли?Дошли, я позже отвечу.
...
Рейтинг: 0 / 0
Union вопрос к разработчикам
    #38920187
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladorder by 1
Спасибо, работает, возьму на вооружение. И как я раньше не догадался
hvladYuRockНо все равно это не идеально - обязательно сортировать весь результат.Обеспечь соответствующее условие сортировки. Тыжпрограммист, ы ?
Мне нужно из одной и той же таблицы получать одни и те же значения (ид и названия). Но сортировать по разным полям (пример - закрепленные и нет темы форума).
Вижу 3 варианта:
1. Добавление 3-го говнополя для сортировки ORDER BY 3
2. селективная процедура;
3. Манипуляции с select from select

Больше ничё в голову не лезет пока. Все три варианта мне не нравятся.
...
Рейтинг: 0 / 0
25 сообщений из 43, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Union вопрос к разработчикам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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