2012-08-06 62 views
2

我有两个表:tableA和tableB。我如何获得tableA中的所有记录,但不是tableB中的记录?我对正确的方式感兴趣,而不是解决方法。我尝试使用左连接,然后添加where ID is not null。它有效,但我不确定这是否是正确的做法。2个SQL表之间的区别

回答

4
select * from tableA 
where id not in (select id from tableB) 

select * from tableA a 
left join tableB b on a.id = b.id 
where b.id is null 

两者都是以获取你的要求完全可以接受的方式。

+0

没有加入的人应该会更快吗?或者他们完全一样?我总是被告知连接应该几乎只用于显示来自2个表格的数据,否则,使用select .. from ..在哪里选择... – Pacane 2012-08-06 17:14:58

+0

我认为这取决于。我在我的数据库的表上做了两个查询的'select select ...',第一个语句对'null'键做了全表扫描。第二个没有。但是,如果性能是一个问题,我会建议使用'explain'运行这两个查询并查看差异。 – 2012-08-06 17:19:23

0

如果需要在页面上显示数据(编程),如果需要将数据从一个表移动到另一个表进行备份或其他类似目的,则必须使用连接,则需要sql比较工具。 首先你需要sql左连接。让你的表格中的左一个,并把和为B

select * from A 
left join B on A.id = B.id 
where b.id is null 
0

可以使用NOT EXISTS加入。我倾向于使用NOT EXISTS,因为当列允许空值但没有空值时,NOT IN的性能明显劣于NOT EXISTS

Select * from table1 a 
    Where not exists (Select ID from table2 b where a.ID = b.ID) 

non-nullable列,您可以使用其中的哪个适合于您的情况作为的行为和NOT IN性能和NOT EXISTS是一样的。

0

因为你没有给表架构让我们假设有每个table.id1主键,ID2

你可以在左连接的帮助下完成。

SELECT * FROM表1左连接表2,其中ID2是空

注意,这不是一个实际的查询只是一个提示让你先走。