Означает ли SELECT DISTINCT своего рода результаты - PullRequest
7 голосов
/ 28 марта 2009

Означает ли включение DISTINCT в запрос SELECT, что результирующий набор должен быть отсортирован?

Не думаю, что это так, но я ищу авторитетный ответ (веб-ссылка).

У меня такой запрос:

Select Distinct foo
From Bar

В oracle результаты различны, но не в отсортированном порядке. В Jet / MS-Access, кажется, выполняется дополнительная работа для обеспечения сортировки результатов. Я предполагаю, что в этом случае оракул следует спецификации, а MS Access выходит за рамки.

Кроме того, есть ли способ дать подсказку таблице о том, что она должна сортироваться по foo (если не указано иное)?

Ответы [ 10 ]

5 голосов
/ 28 марта 2009

Нет. Существует ряд обстоятельств, при которых DISTINCT в Oracle не подразумевает сортировку, наиболее важным из которых является алгоритм хеширования, используемый в 10g + как для групповых, так и для отдельных операций.

Всегда укажите ORDER BY, если вы хотите упорядоченный набор результатов, даже в 9i и ниже.

5 голосов
/ 28 марта 2009

Из спецификации SQL92 :

Если указан DISTINCT, то пусть TXA будет результатом удаления избыточных дублирующихся значений из TX. В противном случае, пусть TXA будет TX.

...

4) Если an не указан, то порядок строк Q зависит от реализации.

В конечном итоге реальный ответ заключается в том, что DISTINCT и ORDER BY являются двумя отдельными частями оператора SQL; Если у вас нет предложения ORDER BY, результаты по определению не будут упорядочены.

3 голосов
/ 28 марта 2009

Не существует «официальной» ссылки на ответ, поскольку это не то, что не гарантирует SQL-сервер.

Вы будете часто видеть результаты по порядку, если будете использовать различные побочные эффекты от лучших методов поиска этих результатов. Однако любое количество других факторов может смешивать результаты, и некоторые серверы могут передавать результаты таким образом, чтобы не сортировать их, даже если для получения результатов пришлось сортировать.

Итог: если ваш сервер чего-то не гарантирует, вы не должны на это рассчитывать.

1 голос
/ 26 апреля 2016

В моем случае (сервер SQL) в качестве примера у меня был список стран с числовым значением X, назначенным для каждого. Когда я выполнил выборку, отличную * от Порядка таблицы, по X, он упорядочил ее по X, но в то же время были также упорядочены страны набора результатов, что не было реализовано напрямую. Из моего опыта я скажу, что отличное подразумевает неявную сортировку.

1 голос
/ 28 марта 2009

Насколько мне известно, нет. Единственная причина, по которой я могу придумать, заключается в том, что SQL Server будет внутренне сортировать данные, чтобы обнаруживать и отфильтровывать дубликаты, и, таким образом, возвращать их «предварительно отсортированным» способом. Но я бы не стал полагаться на этот «побочный эффект»: -)

1 голос
/ 28 марта 2009

Нет, это не подразумевает сортировку. По моему опыту, он сортируется по известному индексу, который может быть foo.

Зачем быть тонким? Почему бы не выбрать Select Distinct foo в Bar Bar по foo?

0 голосов
/ 29 марта 2009

Как обычно говорят ответы, DISTINCT не требует сортировки - только ORDER BY обязывает это. Однако одним из стандартных способов достижения результатов DISTINCT является сортировка; другой - хешировать значения (что приводит к полуслучайному секвенированию). Полагаться на эффект сортировки DISTINCT было бы глупо.

0 голосов
/ 28 марта 2009

Да. Oracle использует сортировку, вычисляющую отличное. Вы можете увидеть это, если посмотрите на план объяснения. Тот факт, что он сделал сортировку для этого расчета, никоим образом не подразумевает что результирующий набор будет отсортирован. Если вы хотите, чтобы результирующий набор был отсортирован, вы должны использовать предложение ORDER BY.

0 голосов
/ 28 марта 2009

Нет, результаты не отсортированы. Если вы хотите дать ему «подсказку», вы, безусловно, можете предоставить ЗАКАЗ ПО:

выберите различное foo из бара заказ от foo

Но имейте в виду, что вы можете сортировать не только по алфавиту. Вместо этого вы можете сортировать критерии по другим полям. См:

http://weblogs.sqlteam.com/jeffs/archive/2007/12/13/select-distinct-order-by-error.aspx

0 голосов
/ 28 марта 2009

По крайней мере на одном сервере, который я использовал (возможно, Oracle или SQL Server, около шести лет назад), SELECT DISTINCT был отклонен, если у вас не было предложения ORDER BY. Он был принят на «другом» сервере (Oracle или SQL Server). Ваш пробег может отличаться.

...