Сортировка в «оригинальном порядке» при использовании DISTINCT - PullRequest
2 голосов
/ 27 февраля 2012

У меня есть следующая таблица:

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. Я хочу сохранить исходный порядокрезультаты.

Ответы [ 5 ]

7 голосов
/ 27 февраля 2012

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

select FileName
from TableB
group by FileName
order by min(id)
4 голосов
/ 27 февраля 2012

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

3 голосов
/ 27 февраля 2012

Как ответил Эндрю, упорядочение строк выполняется внутренне, и мы не можем его контролировать.Поэтому для вашей проблемы я предлагаю добавить столбец типа «отметка времени», в котором хранится отметка времени вставки строки.

1 голос
/ 27 февраля 2012

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

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

0 голосов
/ 27 февраля 2012

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

подобно

SELECT FileName
FROM mytable
ORDER BY FileName Desc
...