SQL:如何按特定的选择使用UNION和order?

SQL:如何按特定的选择使用UNION和order?,sql,oracle,select,union,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,3或2,1,3,4 我该怎么做 (我正在使用Oracle)要执行以下操作: select * from ( SELECT id, 2 as ordered FROM a -- returns 1,4,2,3 UNION 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

我该怎么做

(我正在使用Oracle)

要执行以下操作:

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
。如果没有,请更改为“全部联合”

因此,我还注意到,如果您更改为我建议的代码,您将同时获得
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 tips,我找到了一个解决方案:

我正在使用分组依据计数。 我尝试将DISTINCTORDER BY一起使用,但收到错误消息:“不是选定的表达式”


感谢Adrian和blog。

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

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

@阿德里安的回答不起作用。它给出了一个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中的元素位于第一位

  • 这解决了所有情况,即使表b中的元素比表a中的元素多或不同,并且可以在unionYes的第二部分中省略列别名,我知道。但在这样的情况下,你必须要快:)起来!不太完美:我得到了重复的结果…而distinct不起作用…UNION不会过滤重复项,因为这两个集合由于排序常量而不同。+1-帮助我演示了为ORDER by提供别名而不是列名!棘手的,很好的工作。如果你想要“b”行第一,你不想要计数(id)描述吗?此外,只有当“b”是“a”中记录的子集时,这才有效。最后,给定这个特定的示例,您不能依赖于以任何特定的方式对“b”或“a”中的记录进行排序。当我尝试这个方法时,我得到了1,2,4,3作为输出。a)是的,在这个例子中我需要DESC(我忘了输入)。但在我的应用程序中,我需要在表的末尾。b) 没问题,在我的应用程序中,表
    b
    a
    的子集。c) 好的,不管原稿的顺序是什么。伯爵负责:)你可以走了;-)我想你得到了你需要的答案,我主要想向其他人指出在这个解决方案中需要注意的一些事情。我认为这里使用COUNT是很巧妙的。如果表B包含表A中没有的值,这个解决方案将不起作用。@Adrian:它们将被包括在内,但它们的计数将是1,因此它们将与表A中的值混合在一起。这不起作用,因为
    order by 2,1是按第二列和第一列排序的,但在结果集中只有1列
    id
    Yes。我举了它的例子。谢谢你的更正
    SELECT id FROM a -- returns 1,4,2,3
    UNION
    SELECT id FROM b -- returns 2,1
    order by 2,1
    
    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)
    
    SELECT id FROM a -- returns 1,4,2,3
    UNION
    SELECT id FROM b -- returns 2,1
    order by 2,1