2010-05-03 103 views
4
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`); 

它來自一個開源項目,沒有可用的文檔。這個MySQL語句做了什麼?

特別是,cross-join是什麼意思?我只使用連接/左連接。

回答

2

按照MySQL documentation,它基本上爲INNER JOIN的代名詞,而INNER JOIN是一樣的只是JOIN(即「INNER」是默認值)。

+0

所以它是'JOIN'的另一個同義詞,因爲'INNER JION'與'JOIN'相同? – user198729 2010-05-03 07:31:37

+0

是的,我只是添加到我的答案。在「標準」SQL中,'CROSS JOIN'實際上與'INNER JOIN'不同,因爲'INNER JOIN'通常需要謂詞('ON'),而'CROSS JOIN'則不需要。 – 2010-05-03 07:34:24

+0

「標準」SQL中的'CROSS JOIN'如何? – user198729 2010-05-03 07:37:03

1

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

查詢插入到PREFIX_tab_lang了一個選擇的結果。 select是交叉產品的兩列。第三列 - 名稱 - 實際上來自一個完全不同的選擇,這也是非常直接的,除了它的where條件之一是另一個選擇。

總之,這是我見過的最糟糕的問題之一。它的性能可能很糟糕,應該用一些TRANSATION保護的代碼或至少一個存儲過程來代替它。

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)