Подтвердить что ты не робот

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

Это запрос, который я использую:

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

DELETE FROM TB1 WHERE PersonID = '2';
DELETE FROM TB2 WHERE PersonID = '2';

Ответ 4

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

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

Ответ 5

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

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

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

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

Ответ 6

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

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

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

Ответ 7

Вы можете использовать что-то вроде следующего:

DECLARE db_cursor CURSOR FOR  
SELECT name 
FROM master.dbo.sysdatabases 
WHERE name IN ("TB2","TB1")  -- use these databases

OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @name   


WHILE @@FETCH_STATUS = 0   
BEGIN   

       DELETE FROM @name WHERE PersonID ='2'

       FETCH NEXT FROM db_cursor INTO @name   
END  

Ответ 8

CREATE PROCEDURE sp_deleteUserDetails
    @Email varchar(255)
AS
    declare @tempRegId as int
    Delete UserRegistration where [email protected]  
    set @tempRegId = (select Id from UserRegistration where Email = @Email)
    Delete UserProfile where [email protected]

RETURN 0

Ответ 9

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

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

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

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

Ответ 10

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

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;

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

Ответ 11

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

уроки - главная таблица, а уроки__игры подтаблицы, так что правое соединение

Ответ 12

DELETE TB1, TB2
    FROM customer_details
        LEFT JOIN customer_booking on TB1.cust_id = TB2.fk_cust_id
    WHERE TB1.cust_id = $id

Ответ 13

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

DELETE TB1, TB2 FROM TB1 INNER JOIN TB2  
WHERE TB1.PersonID = TB2.PersonID and TB1.PersonID = '2'