[英]SQL: how to use UNION and order by a specific select?
我有两个选择:
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
我怎样才能做到这一点?
(我正在使用甲骨文)
您想这样做:
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
使用@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和这个博客。
@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具有更多或不同的元素
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的答案非常合适,我只想分享另一种实现相同结果的方法:
select nvl(a.id, b.id)
from a full outer join b on a.id = b.id
order by b.id;
SELECT id FROM a -- returns 1,4,2,3
UNION
SELECT id FROM b -- returns 2,1
order by 2,1
WIITH subq as (SELECT id FROM a ORDER BY id)
SELECT id FROM subq
UNION
SELECT id FROM b
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.