【发布时间】:2023-03-06 08:28:01
【问题描述】:
我在此处复制了 toptal 上发布的这个示例面试问题和答案。但我真的不明白代码。一个 UNION ALL 怎么能变成这样的一个 UNION (distinct)?另外,为什么这段代码更快?
问题
使用 UNION ALL(不是 UNION)编写 SQL 查询,该查询使用 WHERE 子句消除重复项。你为什么要这样做? 隐藏答案 您可以通过运行如下查询来避免使用 UNION ALL 重复,并且运行速度仍然比 UNION DISTINCT(实际上与 UNION 相同)快得多:
回答
SELECT * FROM mytable WHERE a=X UNION ALL SELECT * FROM mytable WHERE b=Y AND a!=X
The key is the AND a!=X part. This gives you the benefits of the UNION (a.k.a., UNION DISTINCT) command, while avoiding much of its performance hit.
【问题讨论】:
-
这种解释具有误导性......它本质上是在做一个
UNION ALL,但过滤掉了第一个查询的结果。它只是使用WHERE子句进行过滤,而不是使用昂贵的DISTINCT操作。 -
答案是错误的。此查询不会消除表中已经存在的重复项,而 UNION DISTICT 可以。
-
@PaulSpiegel,假设有一个主键不涉及
a,由于select *,就不会有重复。 -
能否引用问答的出处?你确定这是问答的全部内容吗?
标签: mysql sql sql-server union union-all