使用具有WHERE条件的单个查询(SQL Express 2005)从多个表中删除行

时间:2009-11-11 11:18:02

标签: sql sql-server sql-server-express sql-server-2005-express

这是我正在使用的查询:

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

它在MS Access中正常工作但在SQL Server Express 2005中收到错误(','。附近的语法不正确)。

如何解决?请帮忙。

14 个答案:

答案 0 :(得分:18)

您不能DELETE来自SQL 2005中具有单个表达式的多个表 - 或者任何其他标准SQL。 Access是例外。

获得此效果的最佳方法是使用FOREIGN KEYS ON DELETE在表格之间指定trigger

答案 1 :(得分:11)

为什么不使用DELETE CASCADE FK

答案 2 :(得分:3)

这不能在一个声明中完成。您将不得不使用2个语句

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

答案 3 :(得分:2)

据我所知,你不能用一句话来做。

但是你可以构建一个存储过程,在事务的任何表中执行你想要的删除,几乎是一样的。

答案 4 :(得分:1)

我认为你不能一次从多个表中删除(虽然我不确定)。

但是,对我而言,你最好通过级联删除的关系来实现这种效果。如果你这样做,你将能够从一个表中删除记录,而另一个表中的记录将被自动删除。

例如,假设两个表代表客户,以及客户的订单。如果您将关系设置为级联删除,则只需删除客户表中的记录,订单就会自动删除。

请参阅cascading referential integrity constraints上的MSDN文档。

答案 5 :(得分:1)

为引用master主键的详细信息表指定外键,并设置Delete rule = Cascade。

现在当你从主表中删除一条记录时,所有其他详细信息表记录基于删除行的主键值,将被自动删除。

因此,在这种情况下,主表的单个删除查询可以删除主表数据以及子表数据。

答案 6 :(得分:0)

你可以像这样加入

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

但正如Alex所说,一次只有一个。

您需要对表格进行级联约束才能立即执行所有操作

答案 7 :(得分:0)

我用它来清理测试/开发数据库中的数据。您可以按表名称和记录计数进行过滤。

containsAll()

参考信息:

答案 8 :(得分:0)

在过程中使用此

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;

答案 9 :(得分:-1)

您可以使用以下内容:

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  

答案 10 :(得分:-1)

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

RETURN 0

答案 11 :(得分:-1)

$ qry =“从lessons_game lg中删除lg。,l。。在lg.lesson_id = l.id的l.id =吗?上正确加入课程l”;

课程是主表, lessons_game是子表,因此可以右加入

答案 12 :(得分:-2)

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

答案 13 :(得分:-2)

尝试此查询

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