如何从两个表中获取不匹配的记录

8

请看这两个样例表:

表1:

id    acc_no    name
------------------------
1     14        aaaa
2     16        bbbb
3     18        ccccc
4     25        wwww
5     27        xxxxxxx
6     28        zzzzzzz

表格2:

sr no   acc_no  amount
----------------------
1       14      2000
2       16      2344
3       18      3200

我需要根据帐号获取记录,这些记录在表1中没有匹配的,例如:

输出:

id   acc_no   name
---------------------
4    25       wwww
5    27       xxxxxxx
6    28       zzzzzzz

当我尝试使用以下查询时,结果不够可靠:
SELECT t1.* 
FROM table1 t1
     LEFT OUTER JOIN table2 t2 ON t1.acc_no = t2.acc_no
WHERE t2.acc_no IS NULL

请给出您的建议。获取上述输出的正确SQL查询语句是什么?


为什么结果不可靠? - fthiella
您的查询是正确的。问题出在哪里? - John Woo
1
http://sqlfiddle.com/#!2/c63e7/1 它运行得很好。 - Nandu
3个回答

12

尝试:

SELECT * 
FROM table1 t1
WHERE t1.acc_no NOT IN (SELECT acc_no FROM table2)

11

应该是:

select t1.id,t1.acc_no,t1.name from table1 t1
     left outer join table2 t2 on t1.acc_no = t2.acc_no
       where
     t2.id is null

@Devand Rathod:只有当两个表中的Id字段相关联时,才能起作用-例如,Table 1 Id是Table 2中的外键。从海报的示例代码中判断,这并不清楚(虽然可能)是否是这种情况。 - Anthill
是的,没错,但是账户号码呢?如果你使用账户号码呢? - Devang Rathod
你可以使用 acc_no,据我所知。 - Devang Rathod
当然 - 这就是帖子中展示的代码。它应该按原样工作。作者没有定义他为什么认为他没有得到可靠的结果。 - Anthill

1
尝试这个:
select t1.* from table1 t1 where 
    not exists (
    select 1 from table2 t2 
    where t1.acc_no=t2.acc_no
    )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接