Форум: "Базы";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];
Внизобработка 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.034 c