【问题标题】:Sort in "original order" when using DISTINCT使用 DISTINCT 时按“原始顺序”排序
【发布时间】:2012-03-16 23:23:27
【问题描述】:

我有下表:

CREATE TABLE [dbo].[TableB](
    [id] [int] NULL,
    [FileName] [varchar](20) NULL
)

INSERT INTO [TableB] ([id],[FileName])VALUES(1,'File2')                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
INSERT INTO [TableB] ([id],[FileName])VALUES(2,'File1')                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
INSERT INTO [TableB] ([id],[FileName])VALUES(3,'File1')

当我做一个简单的SELECT 时,它会给出以下结果:

id          FileName            
----------- --------------------
          1 File2               
          2 File1               
          3 File1  

但是,当我添加 DISTINCT 时,它会给出:

FileName            
--------------------
File1               
File2

我不需要排序,我需要如下结果:

FileName            
--------------------
File2               
File1

我正在使用 SQL Server 2008。我想保持结果的原始顺序。

【问题讨论】:

    标签: sql sql-server-2008 sorting distinct


    【解决方案1】:

    事实是您不知道数据库中元组的顺序。您可以重新登录,它们将以另一种方式订购。这就是为什么没有original order 这样的东西。

    【讨论】:

      【解决方案2】:

      正如 Andrew 所回答的,行排序是在内部完成的,我们无法控制它。因此,对于您的问题,我建议添加一个像“timestamp”这样的列来保留行插入的时间戳。

      【讨论】:

        【解决方案3】:

        如果您“需要”特定顺序的结果,则应在 ORDER BY 子句中声明该顺序。

        喜欢

        SELECT FileName
        FROM mytable
        ORDER BY FileName Desc
        

        【讨论】:

          【解决方案4】:

          实际上,当您使用DISTINCT 时,数据库引擎需要使用一种算法来消除重复项。可以通过将元素插入到 std::set (C++) 的等效项中。它只能通过哈希函数来完成。

          请记住,关系数据库中的表是没有自然顺序的行的集合。如果您希望行中的自然顺序,则必须为它们提供序列号或 id,并始终在查询中使用 ORDER BY

          【讨论】:

            【解决方案5】:

            假设您希望按每个 FileName 记录的第一个 id 对结果进行排序,请尝试:

            select FileName
            from TableB
            group by FileName
            order by min(id)
            

            【讨论】:

            • 出于好奇,order by idorder by min(id) 在这种情况下有什么区别?
            • min(id) 是组内id 的最小值。 order by id 不是按 id 分组的分组查询中的有效排序顺序,因为返回的每一行可能有多个 id 值;将无法确定应该使用哪个值进行排序。
            • 感谢您的澄清:)
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-01-17
            • 1970-01-01
            • 2021-05-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多