2010-07-22 74 views
3

我想要一个查询产生以下结果..查询与加入3个表

导致了在表1和表2中,并没有在表3的记录。

每个表中有超过10,000条记录..所以我正在寻找一个有效的。在所有的表Cono是主键..

详细的表。

表1: -

Cono  

th-123 
th-124 
th-125 

表2: -

Cono  

th-234 
th-245 
th-256 

表3: -

Cono  

th-124 
th-125 
th-256 

现在我想有FOLL由于记录

结果表: -

Cono  

th-123 
th-234 
th-245 

回答

3

试试这个

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

我们可以在这种情况下使用UNION ALL – 2010-07-22 12:54:56

+0

@Vash Tx。回答编辑。 – 2010-07-22 12:57:44

+0

@Vash,你基于什么假设'我们可以在这种情况下使用UNION ALL'?对于OP的简单示例数据,“UNION ALL”可以工作,但它是否会成为生产中的正确方式?谁知道。我宁愿使用它,因为它速度更快,但我不打算做出这样的假设,除非OP提供更多信息。 – 2010-07-22 13:03:10

1

试试这个:

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

试试这个(未测试):

; 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

种类,但这里是你可以做什么,如果你真的想这样做在一个查询:

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

这应该选择在表3中没有查询存在的价值是括号中被创造,这是在表1和表2

不幸的是,筑巢和效率通常不走手牵手行由表...

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'会比'left join'更快,'UNION ALL'也可能会产生重复,OP的数据还没有被足够的解释以假定table1.cono和table2.cono的值不会重叠。 – 2010-07-22 17:15:49

+0

@KM,请提供参考,说明存在速度更快。 – 2010-07-22 17:44:00

+0

看到这篇文章:http://explainextended.com/2009/06/16/in-vs-join-vs-exists/它基本上说,联接和EXISTS有时会有相同的执行计划,有时不会。但是,当他们不EXISTS会稍微快一点。 – 2010-07-22 20:00:35

0

这个 为我工作......并快速处理:

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 
;