【问题标题】:Unioned queries with subqueries disobeys order by clauses带有子查询的联合查询不遵守 order by 子句
【发布时间】:2011-10-03 18:25:02
【问题描述】:

我有一个问题:

select * from (select top 100 percent ... from [table] 
    where [field1] is not null
    order by [field1]) a 
union all 
select * from (select top 100 percent ... from [table]
    where [field1] is null 
    order by [field2]) b

子查询对其结果进行了正确排序。我想要第一个子查询的确切结果,然后是第二个子查询的确切结果。但是,我实际上是以某种奇怪的方式排序的连接结果,我什至无法从中辨别出其中的模式。我的 [field2] 值显然是随机散布在结果集中的。

如何在顶部获取第一个查询结果,在底部获取第二个查询结果?

编辑:澄清一下,我希望顶部查询按其自身条件排序,然后我希望底部查询按其自身条件排序。

【问题讨论】:

  • top 100 percent 对我来说似乎没什么用......
  • @Rahul:然后我得到“关键字'union'附近的语法不正确”。
  • @Daniel:在子查询中放置 ORDER BY 时必须指定 TOP。我不知道为什么。
  • @tsilb:我不这么认为。例如,请参阅here。
  • @tslib,我的错误......对不起......如果要订购,该字段必须处于选择状态

标签: sql tsql


【解决方案1】:

我不确定 UNION ALL 是否旨在保留行的顺序。
您可以使用以下语句强制执行您想要的顺序:

select [field1] from
(
    select * from
    (select 1 as query_number, [field1], [field1] as [order_field] from [table] 
        where [field1] is not null) a 
    union all 
    select * from
    (select 2 as query_number, [field1], [field2] as [order_field] from [table]
        where [field1] is null) b
)
order by query_number, [order_field];

【讨论】:

    【解决方案2】:
    select * from (select top 100 percent ...,  1 AS q from [table] 
        where [field1] is not null
        order by [field1]) a 
    union all
    
    select * from (select top 100 percent ...,  2 AS q from [table]
        where [field1] is null 
        order by [field2]) b
    
    order by q
           , CASE q
               WHEN 1 THEN fieldX   
               WHEN 2 THEN fieldY
             END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      相关资源
      最近更新 更多