【发布时间】:2011-08-27 13:34:12
【问题描述】:
我有两个选择:
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)
【问题讨论】:
我有两个选择:
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)
【问题讨论】:
SELECT id FROM a -- returns 1,4,2,3
UNION
SELECT id FROM b -- returns 2,1
order by 2,1
【讨论】:
order by 2, 1 按第二列和第一列排序,但在结果集中你只有一列id
@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 有更多或不同的元素
【讨论】:
@Adrian 的回答非常合适,我只是想分享另一种实现相同结果的方法:
select nvl(a.id, b.id)
from a full outer join b on a.id = b.id
order by b.id;
【讨论】:
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;
【讨论】:
使用@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 博客。
【讨论】:
b 是 a 的子集。 c) 好的,无论原件选择的顺序是什么。计数完成工作:)
你想这样做:
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
【讨论】: