par
ouckileou » 09 juin 2008, 12:19
Bon pour être sûr j'ai fait des tests :
Code : Tout sélectionner
CREATE TABLE `tests`.`table1` (
`cle1` TINYINT( 2 ) UNSIGNED NOT NULL ,
`cle2` TINYINT( 2 ) UNSIGNED NOT NULL ,
`libelle` VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY ( `cle1` , `cle2` )
) ENGINE = InnoDB
CREATE TABLE `tests`.`table2` (
`cle1` TINYINT( 2 ) UNSIGNED NOT NULL ,
`cle2` TINYINT( 2 ) UNSIGNED NOT NULL ,
`libelle` VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY ( `cle1` , `cle2` )
) ENGINE = InnoDB
INSERT INTO table1 (cle1, cle2, libelle) VALUES (1, 1, 'enregistrement 1 - présent dans les 2 tables');
INSERT INTO table1 (cle1, cle2, libelle) VALUES (2, 2, 'enregistrement 2 - présent dans les 2 tables');
INSERT INTO table1 (cle1, cle2, libelle) VALUES (3, 3, 'enregistrement 3 - présent dans les 2 tables');
INSERT INTO table1 (cle1, cle2, libelle) VALUES (4, 4, 'enregistrement 4 - présent dans table 1 uniquement');
INSERT INTO table1 (cle1, cle2, libelle) VALUES (5, 5, 'enregistrement 5 - présent dans table 1 uniquement');
INSERT INTO table1 (cle1, cle2, libelle) VALUES (6, 6, 'enregistrement 6 - présent dans les 2 tables');
INSERT INTO table2 (cle1, cle2, libelle) VALUES (1, 1, 'enregistrement 1 - présent dans les 2 tables');
INSERT INTO table2 (cle1, cle2, libelle) VALUES (2, 2, 'enregistrement 2 - présent dans les 2 tables');
INSERT INTO table2 (cle1, cle2, libelle) VALUES (3, 3, 'enregistrement 3 - présent dans les 2 tables');
INSERT INTO table2 (cle1, cle2, libelle) VALUES (6, 6, 'enregistrement 6 - présent dans les 2 tables');
On récupère toutes les lignes :
Code : Tout sélectionner
SELECT t1.cle1, t1.cle2, t2.cle1, t2.cle2, t1.libelle
FROM table1 AS t1
LEFT OUTER JOIN table2 AS t2 ON t1.cle1 = t2.cle1
AND t1.cle2 = t2.cle2
Résultat :
Code : Tout sélectionner
cle1 cle2 cle1 cle2 libelle
1 1 1 1 enregistrement 1 - présent dans les 2 tables
2 2 2 2 enregistrement 2 - présent dans les 2 tables
3 3 3 3 enregistrement 3 - présent dans les 2 tables
4 4 NULL NULL enregistrement 4 - présent dans table 1 uniquement
5 5 NULL NULL enregistrement 5 - présent dans table 1 uniquement
6 6 6 6 enregistrement 6 - présent dans les 2 tables
Et maintenant que celles qui ne sont pas dans la table 2 :
Code : Tout sélectionner
SELECT t1.cle1, t1.cle2, t2.cle1, t2.cle2, t1.libelle
FROM table1 AS t1
LEFT OUTER JOIN table2 AS t2 ON t1.cle1 = t2.cle1
AND t1.cle2 = t2.cle2
WHERE t2.cle1 IS NULL
AND t2.cle2 IS NULL
Résultat :
Code : Tout sélectionner
cle1 cle2 cle1 cle2 libelle
4 4 NULL NULL enregistrement 4 - présent dans table 1 uniquement
5 5 NULL NULL enregistrement 5 - présent dans table 1 uniquement
Bon pour être sûr j'ai fait des tests :
[code]
CREATE TABLE `tests`.`table1` (
`cle1` TINYINT( 2 ) UNSIGNED NOT NULL ,
`cle2` TINYINT( 2 ) UNSIGNED NOT NULL ,
`libelle` VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY ( `cle1` , `cle2` )
) ENGINE = InnoDB
CREATE TABLE `tests`.`table2` (
`cle1` TINYINT( 2 ) UNSIGNED NOT NULL ,
`cle2` TINYINT( 2 ) UNSIGNED NOT NULL ,
`libelle` VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY ( `cle1` , `cle2` )
) ENGINE = InnoDB
INSERT INTO table1 (cle1, cle2, libelle) VALUES (1, 1, 'enregistrement 1 - présent dans les 2 tables');
INSERT INTO table1 (cle1, cle2, libelle) VALUES (2, 2, 'enregistrement 2 - présent dans les 2 tables');
INSERT INTO table1 (cle1, cle2, libelle) VALUES (3, 3, 'enregistrement 3 - présent dans les 2 tables');
INSERT INTO table1 (cle1, cle2, libelle) VALUES (4, 4, 'enregistrement 4 - présent dans table 1 uniquement');
INSERT INTO table1 (cle1, cle2, libelle) VALUES (5, 5, 'enregistrement 5 - présent dans table 1 uniquement');
INSERT INTO table1 (cle1, cle2, libelle) VALUES (6, 6, 'enregistrement 6 - présent dans les 2 tables');
INSERT INTO table2 (cle1, cle2, libelle) VALUES (1, 1, 'enregistrement 1 - présent dans les 2 tables');
INSERT INTO table2 (cle1, cle2, libelle) VALUES (2, 2, 'enregistrement 2 - présent dans les 2 tables');
INSERT INTO table2 (cle1, cle2, libelle) VALUES (3, 3, 'enregistrement 3 - présent dans les 2 tables');
INSERT INTO table2 (cle1, cle2, libelle) VALUES (6, 6, 'enregistrement 6 - présent dans les 2 tables');
[/code]
On récupère toutes les lignes :
[code]
SELECT t1.cle1, t1.cle2, t2.cle1, t2.cle2, t1.libelle
FROM table1 AS t1
LEFT OUTER JOIN table2 AS t2 ON t1.cle1 = t2.cle1
AND t1.cle2 = t2.cle2
[/code]
Résultat :
[code]
cle1 cle2 cle1 cle2 libelle
1 1 1 1 enregistrement 1 - présent dans les 2 tables
2 2 2 2 enregistrement 2 - présent dans les 2 tables
3 3 3 3 enregistrement 3 - présent dans les 2 tables
4 4 NULL NULL enregistrement 4 - présent dans table 1 uniquement
5 5 NULL NULL enregistrement 5 - présent dans table 1 uniquement
6 6 6 6 enregistrement 6 - présent dans les 2 tables
[/code]
Et maintenant que celles qui ne sont pas dans la table 2 :
[code]
SELECT t1.cle1, t1.cle2, t2.cle1, t2.cle2, t1.libelle
FROM table1 AS t1
LEFT OUTER JOIN table2 AS t2 ON t1.cle1 = t2.cle1
AND t1.cle2 = t2.cle2
WHERE t2.cle1 IS NULL
AND t2.cle2 IS NULL
[/code]
Résultat :
[code]
cle1 cle2 cle1 cle2 libelle
4 4 NULL NULL enregistrement 4 - présent dans table 1 uniquement
5 5 NULL NULL enregistrement 5 - présent dans table 1 uniquement
[/code]