【问题标题】:SQL Server query with union and different order by to each section?SQL Server查询与每个部分的联合和不同的顺序?
【发布时间】:2011-12-10 14:14:01
【问题描述】:

我在网站上搜索过这里。这个问题有很多版本的答案。但找不到我正在寻找的具体问题:

假设 xxx,yyy,zzz 有 1 列 3 行:

1   
2   
3   

SELECT a FROM xxx  order by a asc
UNION 
SELECT f FROM yyy order by f desc
UNION 
SELECT t FROM zzz order by t asc

所以想要的结果集是:

1
2
3
3
2
1
1
2
3

UNION 附近出现语法错误。

我知道 union 的顺序问题(并且只有在需要整体 ORDER BY 时才知道如何解决它。)

问题:

我怎样才能得到我想要的输出?

【问题讨论】:

  • 你能展示一个想要的结果集的例子吗?
  • @RoyiNamir,你应该等待更多的答案,然后选择最好的,谢谢你的时间。
  • @Md.EliasHossain 我接受你的评论。谢谢。

标签: sql-server sql-order-by


【解决方案1】:

您必须将 single order by 子句应用于 整个 联合,否则排序不明确:

SELECT a,1 as Pos,a as Ord from xxx
UNION ALL
SELECT f,2,-f from yyy
UNION ALL
SELECT t,3,t from zzz
ORDER BY Pos,Ord

但是,-f 可能会让人觉得是一个肮脏的技巧来实现相反的排序(或者如果包含 NULLs 可能不完全是你想要的),所以你也可以这样做:

SELECT a,1 as Pos,a as OrdAsc,0 as OrdDesc from xxx
UNION ALL
SELECT f,2,0,f from yyy
UNION ALL
SELECT t,3,t,0 from zzz
ORDER BY Pos asc,Ord asc,OrdDesc desc

我不清楚为什么您认为它没有回答您的问题 - 可能是因为结果集中的附加列?如果是这样,您可以将整个 UNION 安排在子查询中:

create table #xxx (a int not null)
create table #yyy (f int not null)
create table #zzz (t int not null)
insert into #xxx (a) select 1 union all select 2 union all select 3
insert into #yyy (f) select 1 union all select 2 union all select 3
insert into #zzz (t) select 1 union all select 2 union all select 3

SELECT a FROM (
SELECT a,1 as Pos,a as Ord from #xxx
UNION ALL
SELECT f,2,-f from #yyy
UNION ALL
SELECT t,3,t from #zzz
) t
ORDER BY Pos,Ord

结果:

a
----
1
2
3
3
2
1
1
2
3

【讨论】:

  • 这不会给我:123321123 ....它会给我总体订单,这对我没有帮助 ....
  • @RoyiNamir - 你能更清楚为什么这不是你的问题的答案吗?
  • 因为我愚蠢到无法理解您可爱的解决方案...i.stack.imgur.com/uuOkM.jpg...现在让我来消化您在这里所做的事情:) 谢谢。
  • 再次感谢您的努力 :)
【解决方案2】:

UNIONing 时要记住的事项:

  • UNION 允许您从不同的SELECT 语句创建具有相同类型数据的RESULTSET
  • RESULTSET 是使用列名前导(第一)SELECT 语句生成的。
  • 对于其他SELECT 语句列,数据类型应根据前导(第一)SELECT 语句匹配。
  • 对于ORDERing,它应用于RESULTSET,因此在UNION的情况下,它只允许ORDER BY在最后一个SELECT语句,但根据前导(第一)SELECT取列名声明,所以下面的例子是正确的:
  • 最后,由于在RESULTSETUNIONing 与不同的表/源将所有数据聚合到一个列中(根据first(leading) SELECT 声明),所以你不能申请@987654338 @ 和 DESC 用于同一列。

正确

SELECT a FROM xxx 
UNION 
SELECT f FROM yyy
UNION 
SELECT t FROM zzz order by a asc

错误根据你的情况

SELECT a FROM xxx 
UNION 
SELECT f FROM yyy
UNION 
SELECT t FROM zzz order by a asc, a desc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 2017-09-03
    • 2010-11-23
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多