【问题标题】:Order by clause with Union in Sql Server在 Sql Server 中使用 Union 的 Order by 子句
【发布时间】:2013-08-14 07:10:06
【问题描述】:

我想要数据库中第一个选项为“全部”的派对名称列表。但我不会将“全部”插入数据库,只需要检索时间。所以,我写了这个查询。

Select 0 PartyId, 'All' Name
Union
select PartyId, Name
from PartyMst

这是我的结果

0   All
1   SHIV ELECTRONICS
2   AAKASH & CO.
3   SHAH & CO.

当我使用order by Name 时,它会显示在结果下方。

2   AAKASH & CO.
0   All
3   SHAH & CO.
1   SHIV ELECTRONICS

但是,我希望第一个选项为“全部”,然后按排序顺序列出各方。 我该怎么做?

【问题讨论】:

    标签: sql sql-server sql-order-by union


    【解决方案1】:

    您需要在ORDER BY 子句中使用带有CASE 的子查询,如下所示:

    SELECT * FROM
    (
      Select 0 PartyId, 'All' Name
      Union
      select PartyId, Name
      from PartyMst
    ) tbl
    ORDER BY CASE WHEN PartyId = 0 THEN 0 ELSE 1 END
    ,Name
    

    输出:

    PARTYID NAME
    0 All
    2 AAKASH & CO.
    3 SHAH & CO.
    1 SHIV ELECTRONICS

    this SQLFiddle

    【讨论】:

      【解决方案2】:

      既然你无论如何都硬编码 0,那么 All 只需在 All 之前添加一个空格

      Select 0 PartyId, ' All' Name
      Union
      select PartyId, Name
      from PartyMst
      ORDER BY Name
      

      SQL FIDDLE

      拉吉

      【讨论】:

      • 我在 2008 R2 和 2012 上都试过。它甚至在我发布的 SQL Fiddle 链接中也有效。不知道为什么它不适合你。不管怎样,@hims056 的回复比较好。
      • 它通过在小提琴中检查来显示写答案。但不是在 sql server 2008.. 我也想知道..
      • 如前所述,对我来说它也适用于 SQL Server。
      【解决方案3】:

      您可以通过这种方式将“order by”与联合中的顶部指令一起使用:

      Select 0 PartyId, 'All' Name
      Union
      select * from ( 
        select top (select count(*) from PartyMst) PartyId, Name
        from PartyMst
        order by Name
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-10
        • 2021-03-30
        • 2011-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-28
        相关资源
        最近更新 更多