查找表1中表2中不存在并返回所有字段的记录

时间:2013-03-22 12:51:13

标签: sql sql-server sql-server-2008 join

我有2张这样的表

+------+-------+------+------+---------+
| NAME |SURNAME|DEPART| POST |EMPLOYEE#|
+------+-------+------+------+---------+
| JACK | LONDON| 111  |WRITER| 12345678|
|......|.......|......|......|.........|
+------+-------+------+------+---------+

+------+-------+------+------+---------+
| NAME |SURNAME|DEPART| POST |  LOGIN  |
+------+-------+------+------+---------+
| MARK | TWAIN | 222  |WRITER| MTWAIN  |
|......|.......|......|......|.........|
+------+-------+------+------+---------+

我需要在表1中找到表2中不存在的记录,并返回所有这些记录的字段。

我使用这样的代码......

SELECT name,depart FROM tb1 EXCEPT SELECT name,depart FROM table2

正如预期的那样,结果只有2个字段NAME,DEPART。

3 个答案:

答案 0 :(得分:5)

基本上,您可以对此使用LEFT JOIN。当Table1上的记录在Table2上找不到任何匹配项时,Table2上的列值的结果将为 NULL ,因此要过滤输出非匹配值,添加一个条件,检查table2上的 NULL 值。

SELECT  a.*
FROM    Table1 a
        LEFT JOIN Table2 b
            ON a.name = b.name AND
                a.depart = b.depart
WHERE   b.Name IS NULL

要进一步了解联接,请访问以下链接:

答案 1 :(得分:1)

假设名字,姓氏和离开足以唯一地识别人,请尝试:

select t1.*
from tb1 t1
where not exists
(select 1
 from table2 t2
 where t1.name = t2.name and 
       t1.surname = t2.surname and 
       t1.depart = t2.depart)

答案 2 :(得分:0)

select *
from tb1
minus
select *
from tb2