Как вы УПОРЯДОЧИВАЕТЕ BY в запросе с использованием МИНУСА?

#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;
  

Однако я думаю, что это вряд ли понадобится.