这是我正在使用的查询:
DELETE TB1.*, TB2.*
FROM TB1
INNER JOIN TB2 ON TB1.PersonID = TB2.PersonID
WHERE (TB1.PersonID)='2'
在MS Access中它运行良好,但在SQL Server Express 2005中出现错误(“附近有语法错误','”)。
如何解决?请帮忙。
这是我正在使用的查询:
DELETE TB1.*, TB2.*
FROM TB1
INNER JOIN TB2 ON TB1.PersonID = TB2.PersonID
WHERE (TB1.PersonID)='2'
在MS Access中它运行良好,但在SQL Server Express 2005中出现错误(“附近有语法错误','”)。
如何解决?请帮忙。
在SQL 2005或任何其他标准的SQL中,都不能使用单个表达式从多个表中DELETE
- Access
是此类情况下的例外。
获得此效果的最佳方法是在表之间指定FOREIGN KEYS
,并使用ON DELETE trigger
。
为什么不使用 DELETE CASCADE FK
?
DELETE FROM TB1 WHERE PersonID = '2';
DELETE FROM TB2 WHERE PersonID = '2';
据我所知,你不能在一句话中完成这个操作。
但是你可以建立一个存储过程,在一个事务中执行你想要删除的任何表中的内容,这几乎是相同的。
我认为你不能一次从多个表中删除(尽管我不确定)。
然而,对我来说,最好的方法是使用级联删除关系来实现这种效果。如果你这样做,你将能够从一个表中删除记录,另一个表中的记录将自动删除。
例如,假设这两个表代表一个客户和客户的订单。如果你设置了级联删除关系,你只需删除客户表中的记录,订单将自动被删除。
请参阅MSDN文档级联引用完整性约束。
为细节表指定外键,该外键引用主表的主键,并设置删除规则=级联。
现在,当您从主表中删除记录时,基于删除行的主键值的所有其他详细信息表记录将自动删除。
因此,在这种情况下,主表的单个删除查询可以同时删除主表数据和子表数据。
在过程中使用此代码
declare cu cursor for SELECT [name] FROM sys.Tables where [name] like 'tbl_%'
declare @table varchar(100)
declare @sql nvarchar(1000)
OPEN cu
FETCH NEXT FROM cu INTO @table
WHILE @@FETCH_STATUS = 0
BEGIN
set @sql = N'delete from ' + @table
EXEC sp_executesql @sql
FETCH NEXT FROM cu INTO @table
END
CLOSE cu;
DEALLOCATE cu;
我不确定为什么有些人把这件事情搞得那么复杂。实际上,我们是可以从多个表中删除行的。以下是我的查询语句,已经经过验证可行。
$sql = "DELETE clients, equine_notes, client_horses FROM clients INNER JOIN client_horses ON client_horses.cID = clients.id INNER JOIN equine_notes ON equine_notes.cID = clients.id WHERE clients.id = '".$cID."'";
客户表包含客户的姓名。client_horses是客户拥有的多匹马的多行记录,equine_notes是我对特定马匹做出的注释。使用INNER JOIN子句,我可以使用一个查询语句删除与该客户相关的所有内容。
希望这可以帮助到您。
WITH obsolete_ids AS (
SELECT pr_r."ID" AS ids
FROM "PULL_REQUEST" pr_r
WHERE 1=1
AND pr_r."STATUS" IN (1)
) , del_commit_junc AS (
DELETE
FROM "PR_TO_COMMIT"
WHERE "REQUEST_ID" IN (SELECT ids FROM obsolete_ids)
)
DELETE
FROM "PULL_REQUEST" pr_out
WHERE pr_out ."ID" IN (SELECT ids FROM obsolete_ids)
实际上,在我的原始查询中,我删除了另外两个表中的外键,但在这里我只粘贴了一个示例。这样我解决了“PR_TO_COMMIT”表中的外键问题。
#Table 1 Create:#
create table Customer_tbl
(
C_id int primary key,
C_Name varchar(50),
C_Address varchar(max),
City varchar(50)
);
#Table 2: Create with Foreign Key Constraints#
create table [order]
(
Ord_Id int primary key,
Item varchar(50),
Quantity int,
Price_Of_1 int,
C_id int foreign key references Customer_tbl(C_id)
on delete cascade
);
delete from Customer_tbl where C_id = 2;