#oracle #sql-order-by
#Oracle #sql-order-by
Вопрос:
Я хочу получить ORDER BY
результат MINUS
запроса.
Моя первая попытка не сработала:
SELECT *
FROM Table1
MINUS
SELECT *
FROM table2
WHERE table2.foo = 'bar'
ORDER BY foo
Как бы вы это сделали?
упс: я делал ORDER BY table2.foo
вместо просто ORDER BY foo
. Теперь это работает.
Комментарии:
1. я полагаю, что это одна и та же таблица? итак, почему вы используете минус?
2. извините, плохой пример. Я изменил его
3. то, что вы делаете, в основном является дорогостоящей операцией, требует полного сканирования таблицы. итак, если вы можете опубликовать некоторые примеры данных, возможно, это можно решить с помощью объединения. (в зависимости от данных) И вам нужны все данные? можете ли вы установить ограничение, которое позволило бы избежать полного сканирования таблицы
4. Есть ли
Table1
foo
столбец?5. @Gabe: Это не имеет значения, вы все равно получите
ORA-00904: "FOO": invalid identifier
, когда будете использоватьselect *
вместо именования столбцов.
Ответ №1:
Однако, чтобы ответить на ваш вопрос, вы можете использовать запрос with:
with tmp_minus as (
SELECT *
FROM Table1
MINUS
SELECT *
FROM table2
WHERE table2.foo = 'bar'
)
select * from tmp_minus
ORDER BY foo
Вы также должны иметь возможность выполнять подвыборку:
select * from (
SELECT *
FROM Table1
MINUS
SELECT *
FROM table2
WHERE table2.foo = 'bar'
) tmp_minus
ORDER BY foo
Ответ №2:
Вы можете использовать позицию вместо имени столбца. Предполагая, что foo является первым столбцом в результатах:
SELECT *
FROM Table1
MINUS
SELECT *
FROM table2
WHERE table2.foo = 'bar'
ORDER BY 1
Обычно вы не хотите, чтобы результаты зависели от определенного порядка столбцов, поэтому я бы использовал это только для запросов adhoc.
Ответ №3:
Если МИНУС был заменен на UNION , ПОРЯДОК BY будет применяться к результату ОБЪЕДИНЕНИЯ. Вы уверены, что это не то, что вы получаете с помощью МИНУСА?
Если это не работает напрямую, то:
SELECT result.*
FROM (SELECT *
FROM Table1
MINUS
SELECT *
FROM table2
WHERE table2.foo = 'bar') AS result
ORDER BY foo;
Однако я думаю, что это вряд ли понадобится.