SQL:如何使用UNION并通过特定的选择进行排序?

时间:2011-05-17 20:36:06

标签: sql oracle select 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,32,1,3,4

我该怎么做?

(我正在使用Oracle)

6 个答案:

答案 0 :(得分:28)

你想这样做:

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

<强>更新

我注意到即使您有两个不同的表,也可以加入ID,这意味着,如果两个表中都有1,则只会出现一次。如果这是期望的行为,您应该坚持UNION。如果没有,请更改为UNION ALL

所以我也注意到,如果您更改为我建议的代码,您将开始同时获得12(来自ab)。在这种情况下,您可能希望将建议的代码更改为:

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

答案 1 :(得分:5)

使用@Adrian提示,我找到了一个解决方案:

我正在使用 GROUP BY COUNT 。 我尝试将 DISTINCT ORDER BY 一起使用,但我收到错误消息:“not a 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);

感谢Adrian和this博客。

答案 2 :(得分:3)

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

说明:

  1. &#34; UNION ALL&#34;结合了2套。 A&#34; UNION&#34;是浪费,因为2套不能相同,因为有序的字段是不同的。
  2. &#34; group by&#34;然后消除重复
  3. &#34;按分钟排序(已订购)&#34;确保表b的元素是第一个
  4. 这解决了所有情况,即使表b有更多或不同的元素,然后表a

答案 3 :(得分:1)

@Adrian的答案非常合适,我只是想分享另一种方法来实现相同的结果:

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

答案 4 :(得分:0)

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;

答案 5 :(得分:0)

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