2010-07-22 8 views
3

Je veux une seule requête pour produire les résultats suivants ..requête avec jointure de 3 tables

au résultat dans les dossiers qui sont dans le tableau 1 et table2 et non étaient en table3.

Il y a plus de 10.000 enregistrements dans chaque table ... donc je suis à la recherche d'un efficace. Dans tout le tableau Cono est la clé primaire ..

En détail avec des tableaux.

TABLEAU 1: -

Cono  

th-123 
th-124 
th-125 

TABLEAU 2: -

Cono  

th-234 
th-245 
th-256 

TABLEAU 3: -

Cono  

th-124 
th-125 
th-256 

Maintenant, je veux avoir le foll dossiers dus

Résultat TABLEAU: -

Cono  

th-123 
th-234 
th-245 

Répondre

3

Essayez cette

WITH Table1 AS 
(
    SELECT 'th-123' CONO UNION 
    SELECT 'th-124' UNION 
    SELECT 'th-125' 
) 
, 
Table2 AS 
(
    SELECT 'th-234' CONO UNION 
    SELECT 'th-245' UNION 
    SELECT 'th-256' 
) 
, 
Table3 AS 
(
    SELECT 'th-124' CONO UNION 
    SELECT 'th-125' UNION 
    SELECT 'th-256' 
) 

SELECT CONO 
FROM Table1 
WHERE NOT EXISTS 
(
    SELECT 1 
    FROM Table3 
    WHERE TABLE1.CONO = TABLE3.CONO 
) 

UNION ALL 

SELECT CONO 
FROM Table2 
WHERE NOT EXISTS 
(
    SELECT 1 
    FROM Table3 
    WHERE TABLE2.CONO = TABLE3.CONO 
) 
+0

Nous pouvons utiliser UNION ALL dans ce cas –

+0

@Vash Tx. Réponse éditée –

+0

@Vash, sur quoi avez-vous basé l'hypothèse «Nous pouvons utiliser UNION ALL dans ce cas»? Pour les données d'exemple simples de l'OP, 'UNION ALL' fonctionnera mais sera-t-il la bonne façon en production? qui doit savoir. Je préférerais l'utiliser car il est plus rapide, mais je ne vais pas faire cette hypothèse à moins que l'OP offre plus d'informations. –

1

essayez ceci:

select t.cono from Table1 t WHERE NOT EXISTS (SELECT 1 
               FROM Table3 x WHERE x.cono=t.cono) 
UNION 
select t.cono from Table2 t WHERE NOT EXISTS (SELECT 1 
               FROM Table3 x WHERE x.cono=t.cono) 
0

Essayez ceci (non testé):

; WITH all_data AS (
    SELECT * FROM table1 
    UNION ALL 
    SELECT * FROM table2 
) 
SELECT * 
FROM all_data ad 
WHERE NOT EXISTS (
    SELECT * 
    FROM table3 t3 
    WHERE ad.Cono = t3.Cono); 
0

Genre de tables vagues et des noms, mais voici ce que vous pouvez faire si vous voulez vraiment le faire dans une requête:

SELECT Cono 
FROM Table3 
WHERE NOT EXISTS (SELECT Cono 
        FROM TABLE1 as T 
        WHERE EXISTS (SELECT * 
            FROM TABLE2 
            WHERE T.Cono = TABLE2.Cono)); 

Cela devrait sélectionner les valeurs dans le tableau 3 qui n'existent pas dans la requête a été créé entre parenthèses, ce qui est une table composée de lignes qui sont dans les tableaux 1 et 2.

Malheureusement, l'imbrication et l'efficacité normalement ne vont pas main dans la main ...

1
(SELECT t1.Cono FROM table1 t1 
LEFT JOIN table3 t3 
ON t3.Cono = t1.Cono 
WHERE t3.Cono IS NULL) 
UNION ALL 
(SELECT t2.Cono FROM table2 t2 
LEFT JOIN table3 t3 
ON t3.Cono = t2.Cono 
WHERE t3.Cono IS NULL) 
+0

'exists' sera plus rapide qu'une 'jointure gauche', aussi 'UNION ALL' pourrait créer des doublons, les données de l'OP n'ont pas été suffisamment expliquées pour supposer que les valeurs de table1.cono et de table2.cono ne se chevauchent pas. –

+0

@KM, s'il vous plaît fournir une référence qui explique que existe est plus rapide. –

+0

voir cet article: http://explainextended.com/2009/06/16/in-vs-join-vs-exists/ il dit essentiellement qu'un JOIN et un EXISTS auront parfois le même plan d'exécution, et parfois non. Cependant, quand ils ne le font pas, les EXISTS seront légèrement plus rapides. –

0

celui-là a fonctionné pour moi ... et processus rapide:

select X.FID, c.id as CID 
from 
(
    select a.id as FID from tbl1 a 
    union 
    select b.id as FID from tbl2 b 
) as X 
left outer join tbl3 c on FID = c.id 
where 
    c.id is null 
;