2010-01-22 4 views
5

как я могу удалить из таблицы A, сравнивая два поля A.P и A.C с таблицами B.P и B.C B., ища все совпадения 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

Какие 'RDBMS' вы используете? – Quassnoi

+0

SQLite ........ – mgmx

ответ

2
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

+0

Нет, не будет. В 'SQL Server' (который является единственной« РСУБД », ваш запрос будет работать), в неиндексированных полях' JOIN' менее эффективен, чем 'IN' или' EXISTS'. Если поля уникальны или проиндексированы правильно, тогда 'JOIN' будет иметь одинаковую эффективность. http://explainextended.com/2009/06/16/in-vs-join-vs-exists/ – Quassnoi

+0

На самом деле этот работает отлично! Также с SQLite ... – mgmx

4
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

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

Вы просите, чтобы удалить все записи из , которые имеют значение C = C к значению в строке в таблице В, который имеет C = 1 и то же значение P ??

То же самое, что и удаление всех строк в A, имеющих значение C = 1 [и такое же значение P в таблице B].

так Попробуйте это:

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

что-то подобное будет работать

DELETE FROM A 
FROM A 
INNER JOIN B ON A.P = B.P AND A.C = B.C AND B.R = 1 
Смежные вопросы