MySQL 联合不是确定性的

MySQL union is not deterministic

乍一看是两个等号查询:

SELECT obj_id 
FROM obj t JOIN joined_a a  ON t.`id` = a.`obj_id`
UNION 
SELECT obj_id
FROM obj t JOIN joined_b b  ON t.`id` = b.`obj_id`;

SELECT obj_id
FROM obj t JOIN joined_b b  ON t.`id` = b.`obj_id`
UNION
SELECT obj_id 
FROM obj t JOIN joined_a a  ON t.`id` = a.`obj_id`;

只有select的顺序不同。

这两个查询的结果行数不同!

怎么可能?

如果我将 DISTINCT 添加到每个 SELECT ...行数量将具有新值,最大值!

如果我给每个 SELECT 添加括号,比如

(select ...)
UNION 
(select ...)

行数量将具有 DISTINCT 的值。

这两个查询将 return 相同的行,但不一定以相同的顺序。

UNION 为您对结果进行重复数据删除,因此 DISTINCT 什么都不做,结果集的大小是相同的,无论 SELECT 顺序如何。

唯一符合您测试的解释是在两者的 运行 之间插入了更多数据。

你是对的!

我中了SQLYog终极版GUI界面v11.11 BUG-feacher的阴险陷阱!!!

GUI 添加到每个查询 LIMIT 0, 1000;后缀 :(

在命令行检查查询,它工作正常。