2013-09-30 53 views
1

我有两个表。SQL连接,比较两列值,匹配col值

Table 1 columns are 
==================== 
(MAINID, XID, Name) 
==================== 
(A1 1 SAP) 
(B2 2 BAPS) 
(C3 3 SWAMI) 

Table 2 columns are 
=================== 
(ID COL1) 
=================== 
(1 XYZ) 
(2 ABC) 

现在,我想找到这XID值不表2中的ID列。在表1中XID是唯一的,并且在表2中ID是PK。

回答

4

替代解决方案是通过使用LEFT JOIN。

SELECT tb1.* 
FROM Table1 AS tb1 LEFT JOIN Table2 AS tb2 
     ON tb1.XID = tb2.ID 
WHERE tb2.ID IS NULL 
5
select xid 
from table1 
where xid not in 
(select id from table2) 
+0

这为我做类似的东西,它看起来也最简单的。 – liquidki

1

这是使用设置差异tipical情况下,然而,由罗萨纳提供的解决方案比这个(不知道史蒂夫·霍华德的解决方案)速度快:

select XID as ID from Table1 
except 
select ID from Table2; 

SQLFiddle

这样你就可以从Table1中获取那些不在Table2中的ID。 注意此解决方案在postgresql中工作,其他RDBMS使用与MINUS不同的子句。

下一个解决方案比使用IN和EXCEPT子句更快:

select XID from Table1 t1 
where (not exists (
    select ID from Table2 t2 where (t1.XID = t2.ID) 
)); 

SQLFiddle

+0

是什么让你认为这些解决方案之一比其他解决方案更快?谈论效率只有在与特定的RDBMS相关时才有意义。有些方法在某些产品中工作速度更快,其他方法在其他方面更可取如果不知道OP使用什么产品,就无法得出结论。 –