繁体   English   中英

SQL:如何使用 UNION 并按特定的 select 订购?

[英]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,32,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

因此,我还注意到,如果更改为我建议的代码,则将同时获得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

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

我正在使用GROUP BYCOUNT 我尝试将DISTINCTORDER 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)

说明:

  1. “ UNION ALL”将2套组合在一起。 “ UNION”很浪费,因为两个集合不能相同,因为有序字段不同。
  2. 然后,“分组依据”消除重复项
  3. “最小排序(有序)”确保表b的元素排在第一位

这解决了所有情况,即使表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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM