Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

обработка UNION в SELECT [D7, любой SQL]


Desdechado ©   (2004-05-13 18:24:00) 

Обнаружил, что в IB при использовании в SELECT этот UNION сортирует результат выборки (видимо, для поиска и удаления дубликатов), тогда как при UNION ALL все идет в том порядке, который задан объединяемыми SELECT'ами.
Вопросы:
1. можно ли как-то отучить сортировать, а то для меня важен порядок выборки, но я не могу его явно задать сортировкой по полям, а могу только порядком SELECT'ов ?
2. как обстоит ситуация в других серверах - Oracle, DB2, MS - они тоже сортируют при UNION ?


Petr V. Abramov   (2004-05-14 22:04:00) [1]

> а как в Oracle?
 index full scan


Desdechado   (2004-05-14 21:00:00) [2]

спасибо.
а как в Oracle?


asp   (2004-05-14 17:23:00) [3]

Desdechado ©   (13.05.04 18:24) > DB2 UNION сортирует так же. При UNION ALL ведет совершенно иначе. Т.е.
SELECT T1.ID
FROM T1
UNION ALL
SELECT T2.ID
FROM T2
Сначала вернет T2, потом T1.
SELECT MAX(<primary-key>) - индекс используется.


kaif   (2004-05-13 19:52:00) [4]

Ну тогда ответ
 Johnmen ©   (13.05.04 18:34) [2] - самый правильный.

еще долго плевался, когда обнаружил, что в IB для SELECT Max( первичный_ключ_INTEGER ) не используется индекс для поиска.

Я только что проверил на Yaffil. Да, это так. В плане NATURAL.


Desdechado   (2004-05-13 19:34:00) [5]

еще долго плевался, когда обнаружил, что в IB для SELECT Max( первичный_ключ_INTEGER ) не используется индекс для поиска.
как с этим в других СУБД?


Desdechado   (2004-05-13 19:29:00) [6]

1. дубликаты в таблицах разных SELECT'ов есть, так надо
2. порядок определяется тем, из каких таблиц берется
например, если есть в таблице А, то оно должно быть в начале
если нет в А, но есть в Б, то тоже в начале
если есть и в А, и в Б, то надо взять только из А (если одинаково), или сначала из А, потом из Б (если разное)
одинаковость определяется отбираемыми полями, наличие определяется условием WHERE, которое для разных таблиц разное

немного сложно написал, но так есть


kaif   (2004-05-13 19:18:00) [7]

А что подразумевается под порядком, который задан объединяемыми SELECT-ами?
Может я ошибаюсь, но order by нельзя включать в эти select-ы до оператора union. По крайней мере в IB это так. А порядок, возвращаемый select-ом без этого ORDER BY может быть лишь случайно тем, что нравится. В общем случае он может оказаться каким угодно... Так что мне видится в этой постановке какое-то логическое противоречие.


Petr V. Abramov   (2004-05-13 19:05:00) [8]

> таки не нужны дубликаты
> отучить сортировать
 И рыбку съесть, и ...
Лучше все же покумекать, чтоб дубликаты не возникали - сортировка - дело недешевое.
Если, конечно, не по фигу :)


Desdechado   (2004-05-13 18:42:00) [9]

[3] таки не нужны дубликаты


Desdechado   (2004-05-13 18:37:00) [10]

2 Johnmen
точно, торможу к концу дня :)
спасибо.


Petr V. Abramov   (2004-05-13 18:35:00) [11]

В Oracle то же самое, по тем же причинам. А чем union all не устраивает?


Соловьев   (2004-05-13 18:34:00) [12]

Может ХП сделать? и сортировать уже
select *
from sp
order by 1


Johnmen   (2004-05-13 18:34:00) [13]

1. Стандартно. Добавляешь в селект константное поле. Напр.:
SELECT 0, ...
UNION
SELECT 1, ...
UNION
SELECT 2, ...
UNION
...


Наверх

Титульная страница Поиск, карта сайта Написать письмо