我有下表:
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.我想保持结果的原始顺序。
答案 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