【问题标题】:is it possible to add records to a result set after Order By in a stored procedure?是否可以在存储过程中的 Order By 之后将记录添加到结果集中?
【发布时间】:2012-02-23 19:32:15
【问题描述】:

当我问这个问题时,这听起来像是一个愚蠢的问题,但我是 SQL 新手,不确定这样的事情是否可行。

我想从一个表中选择除 2 之外的所有记录,按字母顺序排列它们,然后将最后两个附加到末尾。我可以在 select 语句中执行此操作,还是必须创建一个临时表并从中返回结果集?

基本上,在伪代码中,我想这样做:

select
  firstname,
  lastname, 
  otherdata
  from People
    where firstname != 'john' or 'mark'
      order by firstname
  add John and Mark

提前致谢。

【问题讨论】:

    标签: sql sql-server-2005 stored-procedures


    【解决方案1】:

    不,您需要使用UNION 来组合查询,并且ORDER BY 必须排在最后。例如

    SELECT firstname, lastname, otherdata
     FROM dbo.People
     WHERE firstname NOT IN ('john', 'mark')
    UNION ALL
    SELECT 'John', NULL, NULL
    UNION ALL 
    SELECT 'Mark', NULL, NULL
    ORDER BY firstname;
    

    如果您打算将这两行放在最后,那么您需要其他东西来订购,例如

    SELECT firstname, lastname, otherdata, z = 1
     FROM dbo.People
     WHERE firstname NOT IN ('john', 'mark')
    UNION ALL
    SELECT 'John', NULL, NULL, z = 2
    UNION ALL 
    SELECT 'Mark', NULL, NULL, z = 3
    ORDER BY z, firstname;
    

    您可能会看到一些可爱的技巧,人们会将查询放在子查询中并在那里应用订单(在 TOP 的帮助下),但请注意,这是一个诡计!这不能保证外部查询是如何排序的。

    【讨论】:

    • 谢谢亚伦。桌子的设置方式,没有其他东西可以订购。看起来是临时表天气。 =)
    • 您能解释一下为什么需要临时表吗?我的查询应用了排序,而表中没有任何内容来指示它。
    • 我误解了 z 做了什么。所以它将 z = 1 分配给除 john 和 mark 之外的每条记录,然后给它们 2 和 3 以在最后对它们进行排序?我现在明白了。非常聪明,亚伦。非常聪明,确实。再次感谢,伙计。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多