DISTINCT 函数的替代方案

问题描述 投票:0回答:7

除了使用 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
sql sql-server t-sql performance distinct
7个回答
6
投票

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

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


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 与distinct


1
投票

您是否尝试过在您选择的字段上创建索引?

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


0
投票

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


0
投票

您可以尝试将“where”中的条件移动到连接中,尽管我希望它们会被解析为相同的。

如果您想提高性能,请向 Table1.Foo 和 Table2.Type 添加索引


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

0
投票

当然可以尝试 row_number() 函数。

© www.soinside.com 2019 - 2024. All rights reserved.