SQL: как использовать UNION и упорядочивать по конкретному выбору? - PullRequest
22 голосов
/ 18 мая 2011

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

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)

Ответы [ 5 ]

28 голосов
/ 18 мая 2011

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

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
5 голосов
/ 18 мая 2011

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

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

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

Спасибо Адриану и этому блогу.

3 голосов
/ 30 января 2017

@ Ответ Адриена не работает.Это дает 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)

Объяснение:

  1. "СОЮЗ"ВСЕ "объединяет 2 набора.«СОЮЗ» бесполезен, потому что 2 набора не могут быть одинаковыми, потому что упорядоченное поле отличается.
  2. Затем «группа по» удаляет дубликаты
  3. «Порядок по мин (упорядочено) "гарантирует, что элементы таблицы b будут первыми

Это решает все случаи, даже когда таблица b имеет больше или отличается от элементов, чем таблица a

1 голос
/ 19 мая 2011

@ Ответ Адриана идеально подходит, я просто хотел поделиться другим способом достижения того же результата:

select nvl(a.id, b.id)
from a full outer join b on a.id = b.id
order by b.id;
0 голосов
/ 18 мая 2011
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;
...