我有两个选择:
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)
答案 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
。
所以我也注意到,如果您更改为我建议的代码,您将开始同时获得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
答案 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)
说明:
这解决了所有情况,即使表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