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)
Ответы
Ответ 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;