为什么 UNION 返回的行数少于 MySQL 的子请求之一?

phi*_*e_b 1 mysql sql union

UNION可用于合并两个子请求的行:

SELECT column_name FROM table1
UNION
SELECT column_name FROM table2;
Run Code Online (Sandbox Code Playgroud)

默认情况下,MySQL 的UNION实际上是UNION DISTINCT,这意味着行table1和 的table2共同点已被删除重复。例如:

SELECT * FROM table_1;

--------
| name |
--------
| John |
| Mary |
--------

SELECT * FROM table_2;

---------
| name  |
---------
| John  |
| Steve |
---------

SELECT * FROM table1
UNION
SELECT * FROM table2;

---------
| name  |
---------
| John  |
| Mary  |
| Steve |
---------
Run Code Online (Sandbox Code Playgroud)

请注意,John在最终结果中只出现一次,因为 MySQL 会删除该行的重复项。

我们可以这么说UnionRows.length <= Table1Rows.length + Table2Rows.length

然而,我面临着意想不到的行为。我有UnionRows.length < Table1Rows.length。这意味着当我合并两个集合时,我得到的行数比只取其中一个集合的行数要少。我希望有UnionRows.length >= Table1Rows.lengthUnionRows.length >= Table2Rows.length

phi*_*e_b 5

这是因为UNION还会删除每个子请求中的重复行。例如:

SELECT * FROM table_1;

--------
| name |
--------
| John |
| John |
| John |
--------

SELECT * FROM table_2;

---------
| name  |
---------
| Steve |
---------

SELECT * FROM table1
UNION
SELECT * FROM table2;

---------
| name  |
---------
| John  |
| Steve |
---------
Run Code Online (Sandbox Code Playgroud)

请注意,最终结果的行数少于table_1