我有下表:
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。我想保持结果的原始顺序。
假设您希望结果按每个FileName记录的第一个id排序,请尝试:
select FileName
from TableB
group by FileName
order by min(id)
事实是您不知道数据库中元组的顺序。您可以重新登录,它们将以另一种方式订购。这就是为什么没有original order
这样的东西。
正如Andrew所回答的,行排序是在内部完成的,我们无法控制它。因此,对于您的问题,我建议添加一个类似"timestamp"的列,以保持行插入的时间戳。
在实践中,当您使用DISTINCT
时,数据库引擎需要使用一种算法来消除重复。它可以通过将元素插入到等效的std::set
(C++)中来实现。它只能通过散列函数来完成。
请记住,关系数据库中的表是没有自然顺序的行的集合。如果你想在你的行中有一个自然的顺序,你必须给它们一个序列号或id,并且在查询中总是使用ORDER BY
。
如果您"需要"特定顺序的结果,那么您应该在order BY子句中声明该顺序。
像
SELECT FileName
FROM mytable
ORDER BY FileName Desc