这两条 SQL 语句在所有情况下都相同吗?
SELECT DISTINCT * FROM
(SELECT * FROM tablename UNION ALL SELECT * FROM tablename2) dummyname
Run Code Online (Sandbox Code Playgroud)
和
SELECT * FROM tablename UNION SELECT * FROM tablename2
Run Code Online (Sandbox Code Playgroud)
我总觉得 UNION 很奇怪的一点是它会删除所有非不同的行,即使这些非不同的行出现在 UNION 子句的单个部分中。例如,假设表名只有一列:amt INT。假设 amt INT 不是主键并且对其没有任何唯一约束。然后假设我有两行,其中 amt = 20。无论我使用什么 UNION,结果集中只会出现这两行中的一行。
我正在向其他人解释这种行为,然后想出了上面的例子来证明 UNION 的行为......我相信上面的这两个陈述是相同的(总是),但我只是想确保我所说的是正确的。是否存在上述两个 SQL 语句不会生成完全相同的结果集的边缘情况?
这两个版本是相同的: UNION在功能上等同SELECT DISTINCT于UNION ALL.
UNION 删除表中的重复值以及两个表之间共享的值。
我应该注意到,从性能的角度来看,以下通常比 a 更快UNION:
select distinct t.col1, t.col2
from t
union
select distinct t1.col1, t.col2
from t1;
Run Code Online (Sandbox Code Playgroud)
这可能是违反直觉的。但是,如果表中有索引(col1, col2),那么它可以用于select distinct,减少 的行数union。一些优化器可能会错过这个简化输入的机会。
| 归档时间: |
|
| 查看次数: |
1158 次 |
| 最近记录: |