2012-02-27 47 views
2

我有如下表:排序在「原始順序」使用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 

我不需要排序,我需要的結果像貝爾ow:

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

我在SQL Server 2008上工作。我想維護結果的原始順序。

回答

7

假設你想要的結果通過記錄每個文件名的第一個ID進行排序,請嘗試:

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

出於好奇,是什麼樣的順序之間'通過id'和'ORDER BY分鐘(ID的區別)'在這種情況下? – Tim 2012-02-27 14:03:16

+1

'min(id)'是組內'id'的最小值。 'id by order by'在分組查詢中不是一個有效的排序順序,而不是由'id'分組,因爲每個返回的行可能有多個'id'值;將無法確定應將哪個值用於排序目的。 – 2012-02-27 14:25:08

+0

謝謝你的澄清:) – Tim 2012-02-27 14:27:49

4

事實是,你不知道數據庫中的元組順序。你可以重新登錄,他們將以另一種方式訂購。這就是爲什麼沒有這樣的東西,如original order

3

安德魯回答說,行排序是在內部完成的,我們沒有控制它。因此,對於你的問題,我建議添加一個像「timestamp」這樣的列,以保持行插入的時間戳。

0

如果您需要特定順序的結果,那麼您應該在ORDER BY子句中聲明該順序。

SELECT FileName 
FROM mytable 
ORDER BY FileName Desc 
1

在實踐中,數據庫引擎需要使用一種算法,以便在您使用DISTINCT來消除重複。它可以通過將元素插入到std::set(C++)的等效項中。它只能通過散列函數完成。

請記住,關係數據庫中的表是沒有自然順序的行的集合。如果您想在自己的行中使用自然順序,則必須爲其提供序列號或ID,並且始終在查詢中使用ORDER BY