替代DISTINCT函数

时间:2010-08-05 20:05:51

标签: sql sql-server tsql performance distinct

除了使用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 个答案:

答案 0 :(得分:4)

GROUP BY用于聚合函数使用; DISTINCT只是从可见性中移除重复项(基于每行匹配的所有列值)。

如果TABLE2允许与TABLE1记录关联的重复值,则必须使用任一选项。取决于数据和您想要看到的内容,但您可以使用&用于获得TABLE2中最高(使用MAX)或最低(使用MIN)值的聚合函数...

答案 1 :(得分:2)

不,这就是它的完成方式。

虽然,你可以试试:

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 group by versus distinct

答案 2 :(得分:1)

您是否尝试过对所选字段创建索引?

DISTINCT和GROUP BY的相对成本是有道理的。处理数据的一种方式(也可能是它使用的方式)是按您提供的字段对行进行排序。然后两者之间的区别在于DISTINCT跳过等于前一行的行,而GROUP by碰巧使用相同的相等度量运行计数。

答案 3 :(得分:0)

不,没有,但如果您在此方面遇到性能问题,您可能需要考虑索引。如果您提供更多详细信息,也许我们可以提供帮助

答案 4 :(得分:0)

你可以尝试将'where'中的条件移动到你的连接中,尽管我希望它们会被解析。

如果您尝试提高性能,请向Table1.Foo和Table2.Type

添加索引

答案 5 :(得分:0)

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