Sql 按“排序”;“原始订单”;使用DISTINCT时
我有下表:Sql 按“排序”;“原始订单”;使用DISTINCT时,sql,sql-server-2008,sorting,distinct,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')
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')
当我做一个简单的选择时,它会给出以下结果:
id FileName
----------- --------------------
1 File2
2 File1
3 File1
但是,当我添加DISTINCT
时,它给出:
FileName
--------------------
File1
File2
我不需要排序,我需要的结果如下:
FileName
--------------------
File2
File1
我正在使用SQLServer2008。我想保持结果的原始顺序。事实上,您不知道数据库中元组的顺序。您可以重新登录,它们将以另一种方式订购。这就是为什么没有原始顺序的原因,正如Andrew回答的,行顺序是在内部完成的,我们无法控制它。因此,对于您的问题,我建议添加一个类似“timestamp”的列,它保留行插入的时间戳。如果您“需要”特定顺序的结果,那么您应该在ORDERBY子句中声明该顺序
像
实际上,当您使用DISTINCT
时,数据库引擎需要使用算法来消除重复项。它可以通过将元素插入到等价的std::set
(C++)中来实现。它只能通过哈希函数完成
请记住,关系数据库中的表是没有自然顺序的行的集合。如果您希望在行中按自然顺序排列,则必须给行指定一个序列号或id,并在查询中始终使用order BY
。假设您希望按每个文件名记录的第一个id对结果进行排序,请尝试:
select FileName
from TableB
group by FileName
order by min(id)
出于好奇,order by id
和order by min(id)
在这种情况下有什么区别?min(id)
是组内id
的最小值<代码>按id排序
在未按id
分组的分组查询中不是有效的排序顺序,因为返回的每一行可能有多个id
值;无法确定应使用哪个值进行排序。感谢您的澄清:)
select FileName
from TableB
group by FileName
order by min(id)