Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Union вопрос к разработчикам / 25 сообщений из 43, страница 1 из 2
28.03.2015, 16:57
    #38919896
Евгений Болтик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Union вопрос к разработчикам
Тут дурная мысль пришла и полез в очередной раз искать варианты в Интернете.
Увидел 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
28.03.2015, 17:42
    #38919911
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Union вопрос к разработчикам
Евгений БолтикЕсли были бы скобочки поддерживались, то можно было бы сортировку для каждого запроса указать
про взаимосвязь скобочек и отдельной сортировки ты сам придумал?
и мне тоже интересно, какой сервер в твоей ссылке для union поддерживает скобки.
Order by по стандарту сортирует конечное множество результата запроса.
Хочешь странные сортировки - пиши селективную процедуру, и там ставь запросы и сортировку в них в любом порядке.
...
Рейтинг: 0 / 0
28.03.2015, 18:00
    #38919918
Евгений Болтик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Union вопрос к разработчикам
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
28.03.2015, 18:33
    #38919929
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Union вопрос к разработчикам
Евгений Болтик,

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

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

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


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

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

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

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

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

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

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

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

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

Вы полностью описали, как я хотел бы это видеть :)
имхо все логично и очевидно
...
Рейтинг: 0 / 0
28.03.2015, 23:04
    #38920133
Евгений Болтик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Union вопрос к разработчикам
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
28.03.2015, 23:06
    #38920135
na-
na-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Union вопрос к разработчикам
kdvЕвгений БолтикВы сразу идею в топку.
ради интереса
1. найди и приведи тут сервер, в котором вот такой синтаксис union, со скобками.
2. найди и приведи тут сервер, в котором в обоих частях union можно указывать order by (таким образом, как ты хочешь).
Возможно Firebird будет первым, кто реализует этот удобный и всем понятный синтаксис. Потом подтянутся другие срвера. А потом и в стандарте пропишут.
...
Рейтинг: 0 / 0
28.03.2015, 23:24
    #38920146
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Union вопрос к разработчикам
Евгений Болтикобрати внимание <query_specification> не допускает сортировок
а вот <query_expression> это и есть обычный SELECT со всеми вытекающими
Да ну? У тебя и с чтением плохо?..

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


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

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

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

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

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


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

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

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


то есть когда хрен поймешь, по какому критерию это все отсортировано.
...
Рейтинг: 0 / 0
28.03.2015, 23:41
    #38920155
Евгений Болтик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Union вопрос к разработчикам
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
28.03.2015, 23:47
    #38920157
Евгений Болтик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Union вопрос к разработчикам
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
29.03.2015, 00:36
    #38920165
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Union вопрос к разработчикам
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
29.03.2015, 01:03
    #38920173
na-
na-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Union вопрос к разработчикам
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
29.03.2015, 01:12
    #38920174
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Union вопрос к разработчикам
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
29.03.2015, 01:17
    #38920176
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Union вопрос к разработчикам
hvladа ты не пробовал так и написать ???
Пробовал. invalid ORDER BY clause получал.

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

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

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

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

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

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


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