两个 SELECT 语句之间的 MySQL 笛卡尔积

Posted

技术标签:

【中文标题】两个 SELECT 语句之间的 MySQL 笛卡尔积【英文标题】:MySQL cartesian product between two SELECT statements 【发布时间】:2011-05-27 18:05:27 【问题描述】:

我想在两个 SELECT 语句之间执行笛卡尔积

SELECT 1, 2     INNER JOIN     SELECT 3, 4 ;

我希望结果是 (1,2) 和 (3,4) 的每个组合,例如:

1  3
2  3
1  4
2  4

【问题讨论】:

【参考方案1】:
mysql> select * from
    ->   (select 1 x union select 2 union select 3 union select 4) t
    ->   join
    ->   (select 1 y union select 2 union select 3) tt;
+---+---+
| x | y |
+---+---+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
| 3 | 1 |
| 3 | 2 |
| 3 | 3 |
| 4 | 1 |
| 4 | 2 |
| 4 | 3 |
+---+---+
12 rows in set (0.00 sec)

删除单词join 得到完全相同的结果。

select * from
  (select 1 x union select 2 union select 3 union select 4) t,
  (select 1 y union select 2 union select 3) tt;

【讨论】:

【参考方案2】:

使用这个你的格式不是你说的那样 A(1,2) and B(3,4) 那么 cross join 会像这样执行它:

SELECT Table1.Col1, Table2.Col2
FROM Table1
CROSS JOIN Table2

(A*B)= (1,3),(1,4),(2,3),(2,4)

【讨论】:

【参考方案3】:

如果您指定的表没有任何 JOIN ON 子句或 WHERE 子句中的等式/条件,您将获得您正在寻找的 catesian 产品。

SELECT table1.field1, table2.field2
FROM table1, table2

会给你你想要的。更明确地显示它...

SELECT * FROM table1;
+--------+
| field1 |
+--------+
|      1 |
|      2 |
+--------+

SELECT * FROM table2;
+--------+
| field2 |
+--------+
|      3 |
|      4 |
+--------+

SELECT table1.field1, table2.field2 FROM table1, table2;
+--------+--------+
| field1 | field2 |
+--------+--------+
|      1 |      3 |
|      2 |      3 |
|      1 |      4 |
|      2 |      4 |
+--------+--------+

【讨论】:

【参考方案4】:
select v1, v2
from
  (select 1 as v1 union
   select 2) t1,
  (select 3 as v2 union
   select 4) t2

甚至更简单:

select *
from
  (select 1 union
   select 2) t1,
  (select 3 union
   select 4) t2

【讨论】:

【参考方案5】:

您可以使用 CROSS JOIN 子句

SELECT MyTable1.Col1, MyTable2.Col2
FROM MyTable1
CROSS JOIN MyTable2

其中 MyTable1 有两行包含 1 和 2; MyTable2 有两行,分别是 3 和 4。

【讨论】:

cross join == inner join MySQL 5.0 还有,交叉连接 == 内部连接 ​​== 连接 在 MySQL 中,JOIN、CROSS JOIN 和 INNER JOIN 是语法等价物,但它们并不相同。在没有连接条件的情况下,INNER JOIN 和 ,(逗号)在语义上是等效的:两者都在指定的表之间产生笛卡尔积(即,第一个表中的每一行都连接到第二个表中的每一行)。所以 join==inner join 但对于 cross join 不是 true == inner join 使用CROSS JOIN 而不是INNER JOINJOIN 有一个相当大的理由,但这并不是因为它们产生了什么——它极大地提高了可读性。我数不清有多少次有人在他们的查询中错误地使用了笛卡尔积并且没有注意到,因此连接缺失条件通常是我首先查看的内容之一。 CROSS JOIN 清楚地表明笛卡尔积是故意的并且已被考虑。选择多个FROM 表时的处理相同,可读性和意图受到影响。

以上是关于两个 SELECT 语句之间的 MySQL 笛卡尔积的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 子查询

sql sever将两个表合起来语法

MySQL:

8:单表查询-MySQL

mysql-数据库查询语句汇总

MySQL多表连接查询