【问题标题】:MySQL cartesian product between two SELECT statements两个 SELECT 语句之间的 MySQL 笛卡尔积
【发布时间】: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

【问题讨论】:

    标签: mysql select join


    【解决方案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 表时的处理相同,可读性和意图受到影响。
            猜你喜欢
            • 2020-05-08
            • 2013-11-16
            • 2012-02-23
            • 2012-01-03
            • 2017-03-05
            • 1970-01-01
            • 2015-06-16
            • 2023-03-17
            • 1970-01-01
            相关资源
            最近更新 更多