使用 GROUP BY 子句时 SELECT DISTINCT 总是多余的吗?
Is SELECT DISTINCT always redundant when using a GROUP BY clause?
添加 DISTINCT 是否会改变使用 GROUP BY 子句的 SELECT 查询的结果?
Group by and distinct produce similar execution plans.
据我了解,使用 GROUP BY 子句的表只能包含来自 GROUP BY 或聚合函数的列。
List of aggregate functions 似乎是确定性的,并且 GROUP BY 的组合是唯一的,所以我的假设是它是多余的。
编辑 1: 在 SELECT 之后直接添加 DISTINCT 关键字。不像@lad2025 的示例那样在查询中的任何地方:SELECT name, COUNT(DISTINCT col) ... GROUP BY name。
是的,当您使用 DISTINCT
和聚合函数时它可以改变结果:
SELECT name, COUNT(col) AS result
FROM table
GROUP BY name
对
SELECT name, COUNT(DISTINCT col) AS result
FROM table
GROUP BY name
其他情况如:
SELECT DISTINCT name
FROM table
GROUP BY name
DISTINCT
几乎总是多余的。
编辑:
极端情况(当 GROUP BY
和 SELECT
列列表不匹配时):
CREATE TABLE #tab(col1 INT, col2 INT);
INSERT INTO #tab
VALUES (1,1), (1,1), (2,1), (2,2)
SELECT DISTINCT col2
FROM #tab
GROUP BY col1, col2
SELECT col2
FROM #tab
GROUP BY col1, col2;
输出:
╔══════╗ ╔══════╗
║ col2 ║ ║ col2 ║
╠══════╣ vs ╠══════╣
║ 1 ║ ║ 1 ║
║ 2 ║ ║ 1 ║
╚══════╝ ║ 2 ║
╚══════╝
您没有义务 SELECT
所有 GROUP BY
列,因此在这种情况下它会改变结果。
SELECT COUNT(*)
FROM sys.objects
GROUP BY schema_id, name
--- 或
SELECT DISTINCT COUNT(*)
FROM sys.objects
GROUP BY schema_id, name
由出现在 group by
子句中的表达式和列定义的组在结果集中是唯一的。只要所有这些相同的列都包含在 select
列表中,那么 distinct
将是多余的。正如 Martin Smith 所指出的,这不是必需的。
添加 DISTINCT 是否会改变使用 GROUP BY 子句的 SELECT 查询的结果?
Group by and distinct produce similar execution plans.
据我了解,使用 GROUP BY 子句的表只能包含来自 GROUP BY 或聚合函数的列。
List of aggregate functions 似乎是确定性的,并且 GROUP BY 的组合是唯一的,所以我的假设是它是多余的。
编辑 1: 在 SELECT 之后直接添加 DISTINCT 关键字。不像@lad2025 的示例那样在查询中的任何地方:SELECT name, COUNT(DISTINCT col) ... GROUP BY name。
是的,当您使用 DISTINCT
和聚合函数时它可以改变结果:
SELECT name, COUNT(col) AS result
FROM table
GROUP BY name
对
SELECT name, COUNT(DISTINCT col) AS result
FROM table
GROUP BY name
其他情况如:
SELECT DISTINCT name
FROM table
GROUP BY name
DISTINCT
几乎总是多余的。
编辑:
极端情况(当 GROUP BY
和 SELECT
列列表不匹配时):
CREATE TABLE #tab(col1 INT, col2 INT);
INSERT INTO #tab
VALUES (1,1), (1,1), (2,1), (2,2)
SELECT DISTINCT col2
FROM #tab
GROUP BY col1, col2
SELECT col2
FROM #tab
GROUP BY col1, col2;
输出:
╔══════╗ ╔══════╗
║ col2 ║ ║ col2 ║
╠══════╣ vs ╠══════╣
║ 1 ║ ║ 1 ║
║ 2 ║ ║ 1 ║
╚══════╝ ║ 2 ║
╚══════╝
您没有义务 SELECT
所有 GROUP BY
列,因此在这种情况下它会改变结果。
SELECT COUNT(*)
FROM sys.objects
GROUP BY schema_id, name
--- 或
SELECT DISTINCT COUNT(*)
FROM sys.objects
GROUP BY schema_id, name
由出现在 group by
子句中的表达式和列定义的组在结果集中是唯一的。只要所有这些相同的列都包含在 select
列表中,那么 distinct
将是多余的。正如 Martin Smith 所指出的,这不是必需的。