【问题标题】:What does this MySQL statement do?这个 MySQL 语句是做什么的?
【发布时间】:2011-02-14 22:44:10
【问题描述】:
INSERT IGNORE INTO `PREFIX_tab_lang` (`id_tab`, `id_lang`, `name`)
    (SELECT `id_tab`, id_lang, (SELECT tl.`name`
        FROM `PREFIX_tab_lang` tl
        WHERE tl.`id_lang` = (SELECT c.`value`
            FROM `PREFIX_configuration` c
            WHERE c.`name` = 'PS_LANG_DEFAULT' LIMIT 1) AND tl.`id_tab`=`PREFIX_tab`.`id_tab`)
    FROM `PREFIX_lang` CROSS JOIN `PREFIX_tab`);

它来自一个开源项目,没有可用的文档。

特别是cross-join 是什么意思?我只用过join/left join。

【问题讨论】:

    标签: mysql cross-join


    【解决方案1】:

    您实际上可以将以下查询视为 MySQL 中的同义词:

    SELECT      *
    FROM        Table1
    CROSS JOIN  Table2;
    
    SELECT      *
    FROM        Table1, Table2;
    
    SELECT      *
    FROM        Table1
    INNER JOIN  Table2;
    
    SELECT      *
    FROM        Table1
    JOIN        Table2;
    

    测试用例:

    CREATE TABLE Table1 (id int, value varchar(10));
    CREATE TABLE Table2 (id int, t1_id int);
    
    INSERT INTO Table1 VALUES (1, 'Value 1');
    INSERT INTO Table1 VALUES (2, 'Value 2');
    INSERT INTO Table1 VALUES (3, 'Value 3');
    INSERT INTO Table1 VALUES (4, 'Value 4');
    
    INSERT INTO Table2 VALUES (1, 1);
    INSERT INTO Table2 VALUES (2, 1);
    INSERT INTO Table2 VALUES (3, 2);
    INSERT INTO Table2 VALUES (4, 2);
    INSERT INTO Table2 VALUES (5, 2);
    INSERT INTO Table2 VALUES (6, 3);
    INSERT INTO Table2 VALUES (7, 4);
    INSERT INTO Table2 VALUES (8, 4);
    INSERT INTO Table2 VALUES (9, 4);
    

    所有四个查询都将返回以下结果集:

    +------+---------+------+-------+
    | id   | value   | id   | t1_id |
    +------+---------+------+-------+
    |    1 | Value 1 |    1 |     1 |
    |    2 | Value 2 |    1 |     1 |
    |    3 | Value 3 |    1 |     1 |
    |    4 | Value 4 |    1 |     1 |
    |    1 | Value 1 |    2 |     1 |
    |    2 | Value 2 |    2 |     1 |
    |    3 | Value 3 |    2 |     1 |
    |    4 | Value 4 |    2 |     1 |
    |    1 | Value 1 |    3 |     2 |
    |    2 | Value 2 |    3 |     2 |
    |    3 | Value 3 |    3 |     2 |
    |    4 | Value 4 |    3 |     2 |
    |    1 | Value 1 |    4 |     2 |
    |    2 | Value 2 |    4 |     2 |
    |    3 | Value 3 |    4 |     2 |
    |    4 | Value 4 |    4 |     2 |
    |    1 | Value 1 |    5 |     2 |
    |    2 | Value 2 |    5 |     2 |
    |    3 | Value 3 |    5 |     2 |
    |    4 | Value 4 |    5 |     2 |
    |    1 | Value 1 |    6 |     3 |
    |    2 | Value 2 |    6 |     3 |
    |    3 | Value 3 |    6 |     3 |
    |    4 | Value 4 |    6 |     3 |
    |    1 | Value 1 |    7 |     4 |
    |    2 | Value 2 |    7 |     4 |
    |    3 | Value 3 |    7 |     4 |
    |    4 | Value 4 |    7 |     4 |
    |    1 | Value 1 |    8 |     4 |
    |    2 | Value 2 |    8 |     4 |
    |    3 | Value 3 |    8 |     4 |
    |    4 | Value 4 |    8 |     4 |
    |    1 | Value 1 |    9 |     4 |
    |    2 | Value 2 |    9 |     4 |
    |    3 | Value 3 |    9 |     4 |
    |    4 | Value 4 |    9 |     4 |
    +------+---------+------+-------+
    36 rows in set (0.01 sec)
    

    【讨论】:

      【解决方案2】:

      交叉加入:http://en.wikipedia.org/wiki/Join_%28SQL%29#Cross_join

      查询将选择结果插入PREFIX_tab_lang。选择只是叉积的两列。第三列——名称——实际上来自一个完全不同的选择,除了其中一个 where 条件是另一个选择之外,它也非常简单。

      简而言之,这是我见过的最糟糕的查询之一。它的性能可能很糟糕,应该用一些受 TRANSATION 保护的代码或者至少是一个存储过程来代替它。

      【讨论】:

        【解决方案3】:

        根据MySQL documentation,它基本上是INNER JOIN的同义词,而INNER JOINJOIN相同(即“INNER”是默认值)。

        【讨论】:

        • 所以它是JOIN 的另一个同义词,因为INNER JIONJOIN 相同?
        • 是的,我刚刚将其添加到我的答案中。在“标准”SQL 中,CROSS JOIN 实际上与 INNER JOIN 不同,因为 INNER JOIN 通常需要谓词 (ON) 而CROSS JOIN 不需要。
        • “标准”SQL 中的CROSS JOIN 怎么样?
        • @Daniel Vassallo,所以它是 cartesian join 的同义词?
        • @user198729:是的。 MySQL 对INNER JOINs 和CROSS JOINs 使用了类似的语法。从技术上讲,INNER JOIN 应该需要 ON 谓词,正如 codeka 在上面的评论中指出的那样。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-22
        • 1970-01-01
        • 2017-07-17
        • 2019-03-21
        • 1970-01-01
        相关资源
        最近更新 更多