Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.06;
Скачать: CL | DM;

Вниз

обработка UNION в SELECT   Найти похожие ветки 

 
Desdechado ©   (2004-05-13 18:24) [0]

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


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

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


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

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


 
Petr V. Abramov ©   (2004-05-13 18:35) [3]

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


 
Desdechado ©   (2004-05-13 18:37) [4]

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


 
Desdechado ©   (2004-05-13 18:42) [5]

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


 
Petr V. Abramov ©   (2004-05-13 19:05) [6]

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


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

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


 
Desdechado ©   (2004-05-13 19:29) [8]

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

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


 
Desdechado ©   (2004-05-13 19:34) [9]

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


 
kaif ©   (2004-05-13 19:52) [10]

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

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

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


 
asp ©   (2004-05-14 17:23) [11]

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>) - индекс используется.


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

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


 
Petr V. Abramov ©   (2004-05-14 22:04) [13]

> а как в Oracle?
 index full scan



Страницы: 1 вся ветка

Текущий архив: 2004.06.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.048 c
1-1085496946
init13
2004-05-25 18:55
2004.06.06
StringGrid


3-1084527368
SergeyM
2004-05-14 13:36
2004.06.06
DBMemo


14-1085133857
Sanek_metaller
2004-05-21 14:04
2004.06.06
Opera


1-1085422899
td
2004-05-24 22:21
2004.06.06
Help в html


6-1082520751
Горе Программист
2004-04-21 08:12
2004.06.06
Вопрос по взаимодействию по протоколу TCP/IP при помощи сокетов