Удалять строки из нескольких таблиц с помощью одного запроса (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.
Как его решить? Пожалуйста, помогите.
Ответы
Ответ 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'