#sql #oracle
#sql #Oracle
Вопрос:
каждый порядок инструкций select работает хорошо,
но когда я объединяю оба, это плохо упорядочивает результат
как я могу упорядочить в этом запросе?
SELECT * FROM (SELECT NM, DEP_CD, 2 AS POSITION FROM EMP WHERE DEP_CD='1100'
and (SELECT COUNT(1) FROM BBS_TABLE WHERE UP_DEP_CD = '1100') > 0 ORDER BY NM
DESC)
UNION
SELECT * FROM (SELECT NM, DEP_CD, 1 AS POSITION FROM EMP WHERE DEP_CD '1110'
ORDER BY NM DESC)
ORDER BY 3 DESC
Комментарии:
1. Чего вы ожидали? Что внешний ПОРЯДОК BY будет упорядочен по ПОЗИЦИИ desc, а затем внутри каждой ветви ОБЪЕДИНЕНИЯ ВСЕ, что порядок по NM desc будет сохранен? Это не так, как это работает. Нет смысла упорядочивать каждого члена объединения; вместо этого используйте один ORDER BY в конце —
ORDER BY POSITION DESC, NM DESC
Ответ №1:
Оберните все в еще одну таблицу:
select * from (
SELECT * FROM (SELECT NM, DEP_CD, 2 AS POSITION FROM EMP WHERE DEP_CD='1100' and (SELECT COUNT(1) FROM BBS_TABLE WHERE UP_DEP_CD = '1100') > 0 ORDER BY NM DESC)
UNION
SELECT * FROM (SELECT NM, DEP_CD, 1 AS POSITION FROM EMP WHERE DEP_CD '1110' ORDER BY NM DESC)
) ORDER BY 3 DESC
Ответ №2:
Единственный гарантированный порядок — это последний, который вы запрашиваете. Если вы хотите упорядочить по 3 DESC
и затем NM DESC
, вы должны указать ORDER BY 3 DESC, NM DESC
в конце вашего запроса.
Вы не можете упорядочить by NM DESC
во встроенном представлении, а затем упорядочить by 3 DESC
во внешнем запросе и ожидать NM DESC
, что порядок будет сохранен. По соображениям производительности SQL-запросы не обязательно выполняются в той же последовательности, в которой они записываются; когда строки переходят от одного шага запроса к другому, порядок может не сохраняться.
Остерегайтесь трюков, которые, как может показаться, возвращают правильный порядок без его указания. Существуют некоторые операции, которые возвращают строки в сохраненном порядке, но вы не хотите, чтобы ваши результаты зависели от внутренних операций, выбранных оптимизатором. Например, если вы UNION
используете a SORT GROUP BY
, результаты могут выглядеть нормально. Но завтра, если оптимизатор решит, что HASH GROUP BY
это судьба, результаты могут быть другими.
Если вы хотите получить детерминированные результаты, вы должны полностью указать ORDER BY
в конце.
Комментарии:
1. Есть ли какой-либо способ, которым я могу заказать первый оператор select?
2. Оператор
ORDER BY
for aUNION
применяется к объединенным обоим наборам, а не только к первому или второму. Просто поместите все нужные столбцы в последний порядок, и это должно сработать.
Ответ №3:
ВЫБЕРИТЕ из созданного результата (inner_table) и отсортируйте соответственно
SELECT * FROM (
SELECT * FROM (SELECT NM, DEP_CD, 2 AS POSITION FROM EMP WHERE DEP_CD='1100' and (SELECT COUNT(1) FROM BBS_TABLE WHERE UP_DEP_CD = '1100') > 0 ORDER BY NM DESC)
UNION
SELECT * FROM (SELECT NM, DEP_CD, 1 AS POSITION FROM EMP WHERE DEP_CD '1110' ORDER BY NM DESC)
) AS inner_table
ORDER BY 3 DESC