除了使用 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
GROUP BY
用于聚合函数使用; DISTINCT
只是从可见性中删除重复项(基于每行匹配的所有列值)。
如果 TABLE2 允许与 TABLE1 记录关联的重复值,则必须使用任一选项。取决于数据和您想要查看的内容,但您可以使用 group by & 聚合函数从 TABLE2 中获取最高(使用 MAX)或最低(使用 MIN)值...
不,就是这样。
不过,你可以尝试:
SELECT DISTINCT Table1.Col1, Table2.Col2
FROM Table1
INNER JOIN Table2 ON Table1.FK = Table2.ID AND Table2.Type = 1
WHERE Table1.Foo = 1865
速度取决于您的数据。
您是否尝试过在您选择的字段上创建索引?
DISTINCT 和 GROUP BY 的相对成本是有道理的。处理数据的一种方法(也可能是它正在使用的方法)是按您提供的字段对行进行排序。两者之间的区别在于,DISTINCT 会跳过与前一行相等的行,而 GROUP by 恰好使用相同的相等度量来运行计数。
不,没有,但如果您在这方面遇到性能问题,您可能需要考虑索引。如果您提供更多详细信息,也许我们可以提供帮助
您可以尝试将“where”中的条件移动到连接中,尽管我希望它们会被解析为相同的。
如果您想提高性能,请向 Table1.Foo 和 Table2.Type 添加索引
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
当然可以尝试 row_number() 函数。