2014-12-28 3 views
1

Когда я пишу запрос типа:
Использования Distinct ключевого слова, SQL

SELECT DISTINCT City FROM Customers; 

Это возвращает все различные города в таблице Customers.

Но когда я пишу запрос типа:

SELECT DISTINCT City,* FROM Customers; 

Это возвращает все строки в таблице Customers (с городской колонке первой и все столбцы, в том числе город позже на выходе).

В чем причина отображения всех записей, даже если мы используем отдельное ключевое слово?

+1

потому что во втором вы выбираете все/все из этой таблицы со всем символом *? – CRABOLO

+0

@Sompuperoo, поэтому вы хотите сказать, что приоритет * больше, чем у другого? – svkvvenky

+0

@svkvvenky - Какое поведение вы ожидаете? Каждый город, который будет указан один раз, со случайным рядом? Или вы хотите первую запись для каждого города, используя, например, Select Top 1 * over (City), например: http://stackoverflow.com/questions/6841605/get-top-1-row-of-each -группа –

ответ

5

Ключевое слово DISTINCT не применяется к одному столбцу, оно относится ко всей записи. Если строки вашей таблицы не одинаково оценены для всех столбцов, они не различаются.

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

SELECT Customers.* FROM 
Customers JOIN (
    SELECT city, MAX(ID) as id 
    FROM Customers 
    GROUP BY city 
) as max_id 
on Customers.ID=max_id.id 
+0

Я использую отдельное ключевое слово только в столбце города.
Можете ли вы уточнить свой ответ? – svkvvenky

+0

@svkvvenky Невозможно применить ключевое слово только к одному столбцу. Это не то, что делает SQ. Вместо этого вам нужно уточнить, что вы ожидаете; если у вас есть более одного клиента из каждого города, запись которого будет возвращена в этот город? SQL не может знать, что вы хотели - он думает, что вам нужны разные записи, а не отдельные города. –

+0

Тогда что вы скажете: SELECT DISTINCT *, City FROM Customers; – svkvvenky

1

В

SELECT DISTINCT City FROM Customers;// you just selecting distinct city from table 

В

SELECT DISTINCT City,* FROM Customers; //you select distinct city and again * means all 
              from table (including city also) 

NB: Здесь приоритет * более DISTINCT и DISTINCT выполняется на вашем кортеже (одиночные строки не только ваша колонка город)

2

Он будет отображать только все строки, если каждая строка была уникальной в базе данных. Ключевое слово DISTINCT говорит «исключить точные дубликаты» в выходном наборе. Во втором запросе вы выбираете City, а затем через * все столбцы в таблице. Скажем, у вас были столбцы City, State, Zip, затем City, * - это то же самое, что и City, City, State, Zip. Теперь он будет возвращать уникальные комбинации из них для всех строк в базе данных. Так что если у вас

Name, City, State, Zip 
Joe, Chicago, IL, 60290 
Steve, Chicago, IL, 60290 
Joe, Chicago, IL, 60290 
Joe, Los Angeles, CA, 90012 

И выбранный City, * вы получите

Joe, Chicago, IL, 60290 
Steve, Chicago, IL, 60290 
Joe, Los Angeles, CA, 90012 

с повторяющейся строкой Joe, Chicago, IL, 60290 устранен.

Если вы получаете все строки, я подозреваю, что это связано с тем, что в таблице есть уникальный столбец (возможно, первичный ключ), который заставляет каждую строку быть уникальной.

Возможно, вам понадобится запрос GROUP BY, но затем вам необходимо применить оператор агрегации к оставшимся столбцам, чтобы выбрать, какие значения для них вы хотите.

SELECT State, COUNT(*) as [Customers in State] 
FROM Customers 
GROUP BY State 

Это вернет набор различных состояний с подсчетом количества строк, соответствующих этому состоянию в таблице.

+0

Он хочет вернуть только отдельный город, как он объяснил в своем комментарии к более раннему ответу. Это не указанное поведение для DISTINCT, и без пояснений о том, что он хотел вернуть при выборе дополнительных строк в дополнение к отдельным, я не уверен, как помочь. –

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