【问题标题】:Alternative to DISTINCT Function替代 DISTINCT 函数
【发布时间】:2011-03-26 00:38:56
【问题描述】:

除了使用 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

【问题讨论】:

  • FROM 子句中没有Table3
  • 这里的场景是什么?为什么要区分数据?
  • 相关问题,您为什么想要区分数据? DISTINCT 在这里不可用是有原因的吗?
  • @RedFilter:修正了示例以省略 Table3 并注意所有三列都来自一个表。
  • @Justin:我可以使用 DISTINCT,我只是想知道是否有更好的选择。

标签: sql sql-server tsql performance distinct


【解决方案1】:

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

    【讨论】:

    • Table2.Type = 1 条件移动到 JOIN 子句不会对性能产生影响。
    • @Ryan W Tenney:但它会影响返回的结果,因为当条件在 JOIN 上时,它发生在之前。
    • @OMG Ponies:不,它不会影响结果。在连接中的 on 子句和 where 子句之间移动标准只会影响外连接返回的结果,而不会影响内连接。
    • 我认为说它对性能没有影响有点笼统。对于简单的查询,我会同意,但值得对其进行测试并查看查询计划。 cftips.net/post.cfm/…
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        您可以尝试将“where”中的条件移动到您的连接中,但我希望它们的解析方式相同。

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

        【讨论】:

          【解决方案6】:
          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
          

          【讨论】:

          • 欢迎来到stackoverflow!感谢您提供答案。对您的代码的解释,即使是很小的解释,都会对其他人决定它是否对他们有用。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-23
          • 2011-11-25
          • 2014-03-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多