SQL - 如何在引用其他表时从一个表中删除?

问题描述:

如何从表A中删除两个字段A.P和A.C到表B的B.P和B.C,同时查找B.R = 1的所有匹配?SQL - 如何在引用其他表时从一个表中删除?

实际上既不以下的工作,但它应该进入的方向,不幸的是我无法弄清楚

DELETE FROM A WHERE (A.P = B.P AND A.C = B.C where B.C = 1) 

DELETE FROM A WHERE (SELECT B.P, B.C FROM B WHERE B = 1) 
+0

? – Quassnoi 2010-01-22 17:47:35

+0

SQLite ........ – mgmx 2010-01-23 01:35:18

DELETE 
FROM A 
WHERE EXISTS 
     (
     SELECT NULL 
     FROM b 
     WHERE b.p = a.p 
       AND b.c = a.c 
       AND b.r = 1 
     ) 
+0

@Quassnoi:我的查询不会更快吗? – Hogan 2010-01-22 17:11:17

+0

不,它不会。在'SQL Server'(这是唯一的'RDBMS'你的查询将起作用),在未加索引的字段上'JOIN'效率低于'IN'或'EXISTS'。如果这些字段是唯一的或索引正确,那么'JOIN'将具有相同的效率。 http://explainextended.com/2009/06/16/in-vs-join-vs-exists/ – Quassnoi 2010-01-22 17:26:11

+0

其实这一个完美的作品! 也与SQLite ... – mgmx 2010-01-23 01:26:45

DELETE FROM A 
FROM A INNER JOIN B ON A.P = B.P AND A.C = B.C 
WHERE B.C = 1 

双FROM有时怎么...投人了。

+0

不幸的是不能用于SQLite。 – mgmx 2010-01-23 01:33:49

DELETE FROM A WHERE A.Id IN 
(SELECT A.Id FROM A INNER JOIN B ON A.P = B.P WHERE B.C = 1) 

你要求删除从A 这有一个C值的所有记录=的C值表B中的行具有C = 1和相同的P值?

这与删除A中C值为1 [且表B中的P值相同]中的所有行相同。

所以试试这个:

Delete A 
Where C = 1 
    And Exists 
     (Select * From B 
     Where C = 1 
     And P = A.P) 

像这样的,你使用的是哪个`RDBMS`工作

DELETE FROM A 
FROM A 
INNER JOIN B ON A.P = B.P AND A.C = B.C AND B.R = 1