2012-02-27 4 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

Предполагая, что вы хотите, чтобы результаты были упорядочены по первому идентификатору, записанный для каждого файла, попробуйте:

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

из любопытства, в чем разница между 'порядком id' и' порядка по мин (идентификатор) 'в этом контексте? – Tim

+1

'min (id)' - наименьшее значение 'id' внутри группы. 'order by id' не является допустимым порядком сортировки в сгруппированном запросе, который не сгруппирован по' id', потому что для каждой возвращаемой строки может быть несколько значений 'id'; не было бы способа определить, какое значение следует использовать для сортировки. –

+0

Спасибо за разъяснение :) – Tim

4

Дело в том, что вы не знаете порядок кортежей в базе данных. Вы можете перенаправиться, и они будут заказаны по-другому. Вот почему нет такой вещи, как original order.

3

Как отреагировал Андрей, порядок строк выполняется внутри, и мы не контролируем его. Следовательно, для вашей проблемы я предлагаю добавить столбец типа «timestamp», который сохраняет временную метку вставки строки.

0

Если вам нужны результаты в определенном порядке, то вы должны объявить этот заказ в предложении ORDER BY.

как

SELECT FileName 
FROM mytable 
ORDER BY FileName Desc 
1

На практике, двигатель базы данных необходимо использовать алгоритм для того, чтобы устранить дубликаты при использовании DISTINCT. Это может быть путем вставки элементов в эквивалент std::set (C++). Это можно сделать только через хеш-функцию.

Помните, что таблица в реляционной базе данных представляет собой набор строк без естественного порядка. Если вам нужен естественный порядок в ваших строках, вы должны указать им порядковый номер или идентификатор и всегда использовать ORDER BY в своих запросах.

Смежные вопросы