2016-01-26 77 views
0

我有两个由一个id连接的表。 表A是我定义记录的地方。 表B是我使用定义并添加一些数据的地方。 我做了一些数据标准化和我已经意识到,在表B中有一些的ID不再在表A根据连接结果删除记录

定义。如果我运行此查询:

SELECT B.id_cred, A.id_cre from B LEFT JOIN A ON B.id_cred=A.id_cre 

我看到这些记载,在A.id_cre上为NULL。

我想从表B中删除查询在表A上返回空的那些记录?

是这样的:

DELETE FROM B WHERE id IN (SELECT B.id from B LEFT JOIN A ON B.id_cred=A.id_cre WHERE a.id IS NULL) 

但因为表B是目标和参照的同时此查询引发错误。

不能为UPDATE指定FROM子句

注意目标表B中的连接查询将返回1408行,所以我需要做的是在一个巨大方式

+1

看起来类似于[无法在FROM子句中指定更新的目标表](http://stackoverflow.com/questions/45494/mysql-error-1093-cant-specify-target-table-for-update-在从条款) –

+0

一个SO会帮助你。请检查[此链接](http://stackoverflow.com/questions/1980738/sql-delete-with-join-another-table-for-where-condition) –

回答

2

选项1,使用NOT EXISTS

delete from B 
where not exists (select 1 from A where A.id_cre = B.id_cred) 

选项2,使用DELETEJOIN

delete B 
from B 
left join A on B.id_cred = A.id_cre 
where A.id_cre is null 
+0

谢谢。不存在是我正在寻找的东西。不知道这个命令:) –

-1

为什么不从A表中使用id_cre,因为两者都有该ID。

本声明:

DELETE FROM B WHERE id IN (SELECT B.id from B LEFT JOIN A ON B.id_cred=A.id_cre WHERE a.id IS NULL) 

简单地说,a和b (B.id_cred=A.id_cre)是相同的。

0

这应该做的伎俩:

DELETE FROM B 
WHERE NOT EXISTS (
SELECT id_cre 
FROM A 
WHERE B.id_cred=A.id_cre) 

只要删除任何行来自B,其中密钥不存在于A.

注意:“A”和“B”不能是别名,它们必须是实际的表名。

希望这会有所帮助!