Удалить строки из нескольких таблиц с помощью одного запроса (SQL Express 2005) с условием WHERE - PullRequest
19 голосов
/ 11 ноября 2009

Я использую запрос:

 DELETE TB1.*, TB2.*
   FROM TB1
        INNER JOIN TB2 ON TB1.PersonID = TB2.PersonID 
  WHERE (TB1.PersonID)='2'

В MS Access работает нормально, но появляется ошибка (неправильный синтаксис рядом с ','.) В SQL Server Express 2005.

Как это решить? Пожалуйста, помогите.

Ответы [ 13 ]

18 голосов
/ 11 ноября 2009

Нельзя DELETE из нескольких таблиц с одним выражением в SQL 2005 - или любым другим стандартным SQL в этом отношении. Access здесь исключение.

Лучший способ получить этот эффект - указать FOREIGN KEYS между таблицей с помощью ON DELETE trigger.

11 голосов
/ 11 ноября 2009

Почему вы не используете DELETE CASCADE FK?

3 голосов
/ 11 ноября 2009

Этого нельзя сделать одним утверждением. Вам придется использовать 2 утверждения

DELETE FROM TB1 WHERE PersonID = '2';
DELETE FROM TB2 WHERE PersonID = '2';
2 голосов
/ 11 ноября 2009

Как я знаю, вы не можете сделать это в предложении.

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

1 голос
/ 11 ноября 2009

Укажите внешний ключ для таблиц сведений, которые ссылаются на первичный ключ главного устройства, и установите Delete rule = Cascade.

Теперь, когда вы удаляете запись из основной таблицы, все остальные записи таблицы подробностей, основанные на значении первичного ключа для удаления строк, будут удаляться автоматически.

Таким образом, в этом случае один запрос на удаление основной таблицы может удалить как данные основных таблиц, так и данные дочерних таблиц.

1 голос
/ 11 ноября 2009

Я не думаю, что вы можете удалить из нескольких таблиц одновременно (хотя я не уверен).

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

В качестве примера, скажем, две таблицы представляют клиента и заказы клиента. Если вы установите отношение для каскадного удаления, вы можете просто удалить запись в таблице клиентов, и заказы будут удалены автоматически.

См. Документ MSDN по каскадным ограничениям ссылочной целостности .

0 голосов
/ 01 мая 2019

$ qry = "УДАЛИТЬ lg. , l. ИЗ урока_игры lg УЖЕ ПРАВИЛЬНОЕ ОБЪЕДИНЕНИЕ l ВКЛ lg.lesson_id = l.id ГДЕ l.id =?";

уроки Главный стол и уроки_игры являются подтаблицами, поэтому правое соединение

0 голосов
/ 20 февраля 2019

Я использую это для очистки данных в базах данных тестирования / разработки. Вы можете фильтровать по имени таблицы и количеству записей.

DECLARE @sqlCommand VARCHAR(3000);
DECLARE @tableList TABLE(Value NVARCHAR(128));
DECLARE @TableName VARCHAR(128);
DECLARE @RecordCount INT;

-- get a cursor with a list of table names and their record counts
DECLARE MyCursor CURSOR FAST_FORWARD
FOR SELECT t.name TableName,
           i.rows Records
    FROM sysobjects t,
         sysindexes i
    WHERE 
          t.xtype = 'U'              -- only User tables
          AND i.id = t.id          
          AND i.indid IN(0, 1)       -- 0=Heap, 1=Clustered Index
          AND i.rows < 10            -- Filter by number of records in the table
          AND t.name LIKE 'Test_%';  -- Filter tables by name. You could also provide a list:
                                     -- AND t.name IN ('MyTable1', 'MyTable2', 'MyTable3');
                                     -- or a list of tables to exclude:
                                     -- AND t.name NOT IN ('MySpecialTable', ... );

OPEN MyCursor;

FETCH NEXT FROM MyCursor INTO @TableName, @RecordCount;

-- for each table name in the cursor, delete all records from that table:
WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @sqlCommand = 'DELETE FROM ' + @TableName;
        EXEC (@sqlCommand);
        FETCH NEXT FROM MyCursor INTO @TableName, @RecordCount;
    END;

CLOSE MyCursor;
DEALLOCATE MyCursor;

Справочная информация:

0 голосов
/ 09 июня 2017

Попробуйте этот запрос

DELETE TB1, TB2 FROM TB1 INNER JOIN TB2  
WHERE TB1.PersonID = TB2.PersonID and TB1.PersonID = '2'
0 голосов
/ 11 мая 2017

вы можете присоединиться вот так

DELETE t2
   FROM TB1 t1
        INNER JOIN TB2 t2 ON t1.PersonID = t2.PersonID 
  WHERE t1.PersonID = '2'

но, как упоминал Алекс, только по одному за раз.

Вам нужно каскадное ограничение для таблицы, чтобы сделать все сразу

...