2010-05-03 13 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`); 

Cela provient d'un projet opensource, et aucune documentation disponible. En particulier, que signifie cross-join? J'ai seulement utilisé join/left join.Que fait cette déclaration MySQL?

Répondre

2

Selon le MySQL documentation, il est essentiellement synonyme de INNER JOIN et INNER JOIN est le même que celui que JOIN (qui est, « INNER » est la valeur par défaut).

+0

Donc, c'est encore un autre synonyme de 'JOIN' puisque' INNER JION' est le même que 'JOIN'? – user198729

+0

Oui, je viens d'ajouter cela à ma réponse. En SQL "standard", "CROSS JOIN" est en fait différent de "INNER JOIN", puisque "INNER JOIN" requiert généralement le prédicat ("ON") alors que "CROSS JOIN" ne le fait pas. –

+0

Que diriez-vous de 'CROSS JOIN' en SQL" standard "? – user198729

1

Cross-join: http://en.wikipedia.org/wiki/Join_%28SQL%29#Cross_join

La requête insère dans PREFIX_tab_lang les résultats d'une sélection. Le select est juste deux colonnes du produit croisé. La troisième colonne - nom - vient en réalité d'un select totalement différent, qui est également assez simple sauf que l'une de ses conditions est encore une autre sélection.

En bref, c'est l'une des pires requêtes que j'ai jamais vues. Sa performance est probablement horrible, et il devrait être remplacé par un peu de code protégé par TRANSACTION ou, à tout le moins, une procédure stockée.

1

Vous pouvez réellement considérer les requêtes suivantes pour être synonymes de MySQL:

SELECT  * 
FROM  Table1 
CROSS JOIN Table2; 

SELECT  * 
FROM  Table1, Table2; 

SELECT  * 
FROM  Table1 
INNER JOIN Table2; 

SELECT  * 
FROM  Table1 
JOIN  Table2; 

Test Case:

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); 

Les quatre requêtes retourneraient le jeu de résultat suivant:

+------+---------+------+-------+ 
| 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)