Подтвердить что ты не робот

SQL: как использовать UNION и порядок по определенному выбору?

У меня есть два выбора:

SELECT id FROM a -- returns 1,4,2,3
UNION
SELECT id FROM b -- returns 2,1

Я получаю правильное количество строк, например: 1,4,2,3.

Но сначала я хочу результаты таблицы b: 2,1,4,3 или 2,1,3,4

Как я могу это сделать?

(Я использую Oracle)

4b9b3361

Ответ 1

Используя советы @Adrian, я нашел решение:

Я использую GROUP BY и COUNT. Я попытался использовать DISTINCT с ORDER BY, но я получаю сообщение об ошибке: "не SELECTed выражение"

select id from 
(
    SELECT id FROM a -- returns 1,4,2,3
    UNION ALL -- changed to ALL
    SELECT id FROM b -- returns 2,1
)
GROUP BY id ORDER BY count(id);

Спасибо Adrian и этот блог.

Ответ 2

Вы хотите сделать это:

select * from 
(
    SELECT id, 2 as ordered FROM a -- returns 1,4,2,3
    UNION
    SELECT id, 1 as ordered FROM b -- returns 2,1
)
order by ordered

Обновление

Я заметил, что, хотя у вас есть две разные таблицы, вы присоединяетесь к идентификаторам, это означает, что если у вас есть 1 в обеих таблицах, вы получаете только одно вхождение. Если это желаемое поведение, вы должны придерживаться UNION. Если нет, измените на UNION ALL.

Поэтому я также замечаю, что если вы перейдете на код, который я предложил, вы начнете получать как 1, так и 2 (от a и b). В этом случае вы можете изменить предлагаемый код на:

select distinct id from 
(
    SELECT id, 2 as ordered FROM a -- returns 1,4,2,3
    UNION
    SELECT id, 1 as ordered FROM b -- returns 2,1
)
order by ordered

Ответ 3

@Adrian answer отлично подходит, я просто хотел поделиться другим способом достижения того же результата:

select nvl(a.id, b.id)
from a full outer join b on a.id = b.id
order by b.id;

Ответ 4

@Adrien ответ не работает. Он дает ORA-01791.

Правильный ответ (для заданного вопроса) должен быть:

select id
from 
 (SELECT id, 2 as ordered FROM a -- returns 1,4,2,3
  UNION ALL
  SELECT id, 1 as ordered FROM b -- returns 2,1
  )
group by id
order by min(ordered)

Пояснение:

  • "UNION ALL" объединяет 2 набора. "UNION" бесполезен, потому что два набора не могут быть одинаковыми, потому что упорядоченное поле отличается.
  • "group by" затем удаляет дубликаты
  • "Порядок по min (упорядочен)" гарантирует, что элементы таблицы b сначала

Это решает все случаи, даже если таблица b содержит больше или разных элементов, а затем таблицу

Ответ 5

SELECT id, 1 AS sort_order
  FROM b
UNION
SELECT id, 2 AS sort_order
  FROM a
MINUS
SELECT id, 2 AS sort_order
  FROM b
ORDER BY 2;