Как удалить все строки таблицы A, которые есть в таблице B?

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Как удалить все строки таблицы A, которые есть в таблице B?

Сообщение Faust » 01.02.2006 (Ср) 11:25

Пытаюсь так (A и B - таблицы из единственного поля ID):
Код: Выделить всё
DELETE A.*
FROM A INNER JOIN B ON [A].[ID]=[B].[ID];

Access 2000 посылает меня: мол, нельзя выполнить удаление из указаннных таблиц. Как быть?
Листинги не горят!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.02.2006 (Ср) 11:40

Мож
Код: Выделить всё
DELETE A.* FROM A WHERE A.ID IN (SELECT ID FROM B)
?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 01.02.2006 (Ср) 11:43

Код: Выделить всё
DELETE A
FROM A
  INNER JOIN B ON [A].[ID]=[B].[ID];

При удалении, как и при вставке, аффектится строка целиком. Поэтому бессмысленно указывать столбцы удаляемой таблицы.

Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Сообщение Faust » 02.02.2006 (Чт) 9:17

GSerg, спасибо, такой вариант работает, но некоторые препы панически боятся подзапросов...
Ennor, что-то не пашет... Автоматически берет A в квадратные скобки, а потом говорит, что нужно указать таблицу, из которой будет производится удаление.
Листинги не горят!

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 02.02.2006 (Чт) 11:21

Faust писал(а):GSerg, спасибо, такой вариант работает, но некоторые препы панически боятся подзапросов...

Наверное, потому что на больших таблицах такие запросы очень медленно отрабатывают и усиленно используют ресурсы (для сохранения промежуточных данных). Но иногда без них не обойтись.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 02.02.2006 (Чт) 12:12

Хм... Я конечно понимаю, курица - не птица, Аксесс - не СУБД, но с точки зрения ANSI SQL такой синтаксис проканать обязан:
Код: Выделить всё
delete A
from Table1 as [A]
  inner join Table2 as [B] on (A.Id = B.Id)

Насчет же боязни подзапросов - в нормальных серверных базах данных это не вызывает никаких тормозов. Более того, грамотный оптимизатор запросов, присутствующий в любом нормальном сервере, все равно преобразует твой код в наиболее эффективный, с его точки зрения, план выполнения. MS SQL Server, к слову, умеет преобразовывать тот же подзапрос в эквивалентный ему джойн. Причем делает это еще с каких-то совсем лохматых версий.

А подобные преподские фанаберии, вызванные жесткой привязкой к конкретной СУБД и ее конкретной реализации, впоследствии способствуют формированию у студенческого состава искаженных взглядов не действительность различной степени неадекватности.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList