Альтернатива функции DISTINCT - PullRequest
       6

Альтернатива функции DISTINCT

1 голос
/ 06 августа 2010

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

SELECT DISTINCT Table1.Col1, Table2.Col1, Table1.Col3
FROM Table1 
INNER JOIN Table2 ON Table1.FK = Table2.ID
WHERE Table1.Foo = 1865 AND Table2.Type = 1

Ответы [ 6 ]

4 голосов
/ 06 августа 2010

GROUP BY предназначен для использования агрегатной функции;DISTINCT просто удаляет дубликаты (на основе всех значений столбцов, совпадающих для каждой строки) из видимости.

Если TABLE2 допускает дублирование значений, связанных с записями TABLE1, вы должны использовать любой из этих параметров.Зависит от данных и того, что вы хотите увидеть, но вы можете использовать функцию группировки по группам, чтобы получить самые высокие (используя MAX) или самые низкие (используя MIN) значения из TABLE2 ...

2 голосов
/ 06 августа 2010

Нет, вот как это делается.

Хотя, вы можете попробовать:

SELECT DISTINCT Table1.Col1, Table2.Col2
FROM Table1
INNER JOIN Table2 ON Table1.FK = Table2.ID AND Table2.Type = 1
WHERE Table1.Foo = 1865

Скорость будет зависеть от ваших данных.

Также см. SQL группы по отдельным

1 голос
/ 06 августа 2010

Вы пытались создать индекс для выбранных полей?

Относительные затраты на DISTINCT и GROUP BY имеют смысл. Один из способов обработки данных (и, вероятно, способ их использования) состоит в сортировке строк по полям, которые вы предоставляете. Тогда разница между ними заключается в том, что DISTINCT пропускает строки, равные предыдущей строке, а GROUP by выполняет подсчет с использованием той же метрики равенства.

0 голосов
/ 24 октября 2013
create table #temp (col1 int, col2 int, col3 int)
create index temp_index on #temp (col 1)

insert into #temp
SELECT Table1.Col1, Table2.Col1, Table1.Col3
FROM Table1 
INNER JOIN Table2 ON Table1.FK = Table2.ID
WHERE Table1.Foo = 1865 AND Table2.Type = 1

select distinct col1, col2, col3
from #temp
0 голосов
/ 06 августа 2010

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

Если вы пытаетесь увеличить производительность, добавьте индекс в Table1.Foo и Table2.Type

0 голосов
/ 06 августа 2010

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

...