使用DISTINCT时按“原始顺序”排序

时间:2012-02-27 13:30:42

标签: sql sql-server-2008 sorting distinct

我有下表:

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.我想保持结果的原始顺序。

5 个答案:

答案 0 :(得分:7)

假设您希望按照为每个FileName记录的第一个ID排序结果,请尝试:

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

答案 1 :(得分:4)

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

如果您需要按特定顺序排列结果,那么您应该在ORDER BY子句中声明该顺序。

喜欢

SELECT FileName
FROM mytable
ORDER BY FileName Desc