(NB Ceci n'est pas une réponse, car il semble que la réponse de Giorgos soit ce que vous recherchiez vraiment, mais il est trop long de faire un commentaire Je voulais m'assurer que vous compreniez pourquoi votre requête originale n'est pas faire ce que (je pense) vous pensez que c'est)
Votre requête originale finit par faire une jointure interne, parce que vous demandez des valeurs spécifiques pour les colonnes b.empno et c.empno sans les inclure dans la gauche jointure externe. C'est à dire. vous dites: "premièrement, joignez la jointure externe b à a, et ensuite, filtrez les lignes qui n'ont pas de b.empno = 190". Cela va se débarrasser de toutes les lignes où b.empno est nulle ainsi que d'autres valeurs de b.empno.
Voici un exemple simple montrant les différents comportements:
style ancien jointure externe gauche avec externe non left join filtre:
WITH t1 AS (SELECT 1 ID, 10 val FROM dual UNION ALL
SELECT 2 ID, 20 val FROM dual UNION ALL
SELECT 3 ID, 30 val FROM dual),
t2 AS (SELECT 1 ID, 100 val FROM dual UNION ALL
SELECT 1 ID, 150 val FROM dual UNION ALL
SELECT 2 ID, 200 val FROM dual UNION ALL
SELECT 2 ID, 250 val FROM dual)
SELECT t1.id, t1.val, t2.val
FROM t1,
t2
WHERE t1.id = t2.id(+)
AND t2.val = 200
ORDER BY t1.id, t2.val;
ID VAL VAL
---------- ---------- ----------
2 20 200
style ancien jointure avec filtre:
WITH t1 AS (SELECT 1 ID, 10 val FROM dual UNION ALL
SELECT 2 ID, 20 val FROM dual UNION ALL
SELECT 3 ID, 30 val FROM dual),
t2 AS (SELECT 1 ID, 100 val FROM dual UNION ALL
SELECT 1 ID, 150 val FROM dual UNION ALL
SELECT 2 ID, 200 val FROM dual UNION ALL
SELECT 2 ID, 250 val FROM dual)
SELECT t1.id, t1.val, t2.val
FROM t1,
t2
WHERE t1.id = t2.id
AND t2.val = 200
ORDER BY t1.id, t2.val;
ID VAL VAL
---------- ---------- ----------
2 20 200
Vous pouvez voir que les résultats des deux requêtes ci-dessus sont identique, ce qui signifie que la première requête avec les jointures externes de gauche fait vraiment une jointure interne. Et la syntaxe de jointure ANSI requête équivalente à ce serait:
intérieure ANSI style jointure avec filtre:
WITH t1 AS (SELECT 1 ID, 10 val FROM dual UNION ALL
SELECT 2 ID, 20 val FROM dual UNION ALL
SELECT 3 ID, 30 val FROM dual),
t2 AS (SELECT 1 ID, 100 val FROM dual UNION ALL
SELECT 1 ID, 150 val FROM dual UNION ALL
SELECT 2 ID, 200 val FROM dual UNION ALL
SELECT 2 ID, 250 val FROM dual)
SELECT t1.id, t1.val, t2.val
FROM t1
INNER JOIN t2 ON t1.id = t2.id
WHERE t2.val = 200;
ID VAL VAL
---------- ---------- ----------
2 20 200
Vous pouvez voir la différence des résultats en incluant la colonne filtrée dans la jointure externe dans la requête ancienne d'origine:
style ancien jointure externe gauche avec jointure externe gauche filtre
WITH t1 AS (SELECT 1 ID, 10 val FROM dual UNION ALL
SELECT 2 ID, 20 val FROM dual UNION ALL
SELECT 3 ID, 30 val FROM dual),
t2 AS (SELECT 1 ID, 100 val FROM dual UNION ALL
SELECT 1 ID, 150 val FROM dual UNION ALL
SELECT 2 ID, 200 val FROM dual UNION ALL
SELECT 2 ID, 250 val FROM dual)
SELECT t1.id, t1.val, t2.val
FROM t1,
t2
WHERE t1.id = t2.id(+)
AND t2.val(+) = 200
ORDER BY t1.id, t2.val;
ID VAL VAL
---------- ---------- ----------
1 10
2 20 200
3 30
Et, selon la réponse de Giorgos, la norme ANSI équivalente syntaxe de jointure requête serait:
style ANSI jointure externe avec filtre de jointure externe:
WITH t1 AS (SELECT 1 ID, 10 val FROM dual UNION ALL
SELECT 2 ID, 20 val FROM dual UNION ALL
SELECT 3 ID, 30 val FROM dual),
t2 AS (SELECT 1 ID, 100 val FROM dual UNION ALL
SELECT 1 ID, 150 val FROM dual UNION ALL
SELECT 2 ID, 200 val FROM dual UNION ALL
SELECT 2 ID, 250 val FROM dual)
SELECT t1.id, t1.val, t2.val
FROM t1
left OUTER JOIN t2 ON t1.id = t2.id AND t2.val = 200
ORDER BY t1.id, t2.val;
ID VAL VAL
---------- ---------- ----------
1 10
2 20 200
3 30
MySQL et SQL Server et Oracle? Lesquels utilisez-vous ici?requête d'entrée – jarlh
est d'oracle –
êtes-vous vraiment auto-joindre à la même table deux fois, ou sont ces trois tableaux différents? – Boneist