【问题标题】:Combining ORDER BY AND UNION in SQL Server在 SQL Server 中结合 ORDER BY 和 UNION
【发布时间】:2011-04-05 11:27:08
【问题描述】:

如何在一个结果集中获取表的第一条记录和表的最后一条记录?

此查询失败

SELECT TOP 1 Id,Name FROM Locations ORDER BY Id
UNION ALL
SELECT TOP 1 Id,Name FROM Locations ORDER BY Id DESC

有什么帮助吗?

【问题讨论】:

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


    【解决方案1】:

    将您的order bytop 语句放入子查询中:

    select first.Id, first.Name 
    from (
        select top 1 * 
        from Locations 
        order by Id) first
    union all
    select last.Id, last.Name 
    from (
        select top 1 * 
        from Locations 
        order by Id desc) last
    

    【讨论】:

    • Keith 我使用的是 SQL Server 2005,当我按照您的建议执行操作时,出现以下错误,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效, 除非还指定了 TOP 或 FOR XML。当我尝试以下操作时,SELECT * FROM ( SELECT * FROM CTEWithNDCNotNull ORDER BY NDC ASC ) AS NDCNotNull UNION SELECT * FROM ( SELECT * FROM CTEWithNDCNull ORDER BY GPI ASC ) AS NDCNull 我该如何纠正这个问题?
    • @peplamb 您必须在子查询select 之后指定top。如果不指定所需的行数,则无法对 union 进行排序。
    • 这不可能没有TOP?那么如果我不知道我想要多少行,有什么选择呢?
    • @akousmata 你可以使用top (@limit)。您可能可以使用 rank over ,但它会更复杂,也不会更快。只要列被索引,这个查询就很快。
    【解决方案2】:

    如果您使用的是 SQL Server 2005 或更高版本:

    ; WITH NumberedRows as (
        SELECT Id,Name,
           ROW_NUMBER() OVER (ORDER BY Id) as rnAsc,
           ROW_NUMBER() OVER (ORDER BY Id desc) as rnDesc
        FROM
            Locations
    )
    select * from NumberedRows where rnAsc = 1 or rnDesc = 1
    

    这与您的原始查询不同的唯一地方是表中只有一行(在这种情况下,我的答案返回一行,而您的答案将返回同一行两次)

    【讨论】:

    • 很好的替代答案,但如果您将union all 替换为union,我的也可以返回一行。在查询分析器中比较它们可能是值得的。
    【解决方案3】:
    select * from (
    SELECT TOP 1 Id,Name FROM Locations ORDER BY Id) X
    UNION ALL
    SELECT TOP 1 Id,Name FROM Locations ORDER BY Id DESC
    

    【讨论】:

      【解决方案4】:
      SELECT TOP 1 Id as sameColumn,Name FROM Locations 
      UNION ALL
      SELECT TOP 1 Id as sameColumn,Name FROM Locations ORDER BY sameColumn DESC
      

      【讨论】:

      • 这与现有答案有何不同?
      • 首先我们需要有相同的列名才能使用联合。所以我只是在两个视图中使用相同的别名进行排序。
      • 该列已经是OP的问题中的同名,您还删除了第一条语句中的第一个ORDER BY子句,所以如果Id是一个int,但没有排序,你不会得到“第一个”Id,只是一个随机的。假设您的 Id 列是 9 7 4 8 3 1 您的查询将在两组中返回 9,因为 9 在您根本不排序时是列中的第一个,但在降序排序时也是第一个。
      • @akousmata,假定 Id 是索引的一部分。
      • 这是一个旧答案,但由于它是错误的,我建议您还是删除它,以免混淆任何人。您有两个查询,既没有TOP 子句也没有ORDER BY。这会让你任意挑选两行。然后你UNION ALL 两个查询并排序结果。太晚了:-)
      猜你喜欢
      • 2010-09-26
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      • 1970-01-01
      • 2011-04-10
      • 2019-03-09
      • 1970-01-01
      相关资源
      最近更新 更多