3

对于每个删除语句,我想从具有相同条件(where 子句)的多个表中删除数据。

delete from tblA where id in (select x.id from tblX x where name like N'%test%')
delete from tblB where id in (select x.id from tblX x where name like N'%test%')
delete from tblC where id in (select x.id from tblX x where name like N'%test%')
delete from tblD where id in (select x.id from tblX x where name like N'%test%')

有没有办法声明一个存储来自上面 select 语句的 id 的列表?

我试过了:

declare @ids int
set @ids = select x.id from tblX x where name like N'%test%'

但它抱怨说

子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。

请指教,谢谢。

4

3 回答 3

10

无论如何你都需要一张桌子,但至少你可以通过每次都做类似的事情来避免大​​量的处理:

-- create a table variable
declare @ids table
(
  id int not null
)

-- insert the id into the table variable
insert into @ids
select id from table1 where column1 like '%something%'

-- delete
delete from tablen where id in (select * from @ids)

您也可以使用临时表,它看起来是一样的,但是您需要#ids 而不是@ids,并且您需要在工作完成后删除临时表。

要在临时表(物理表)或表变量(内存表)之间进行选择,您确实需要进行一些测试,但根据定义,复杂数据在临时表中效果更好。如果您只需要在短时间内保存少量 id,我非常确定表变量会更好。

SQL Server 中的临时表和表变量有什么区别?

于 2013-02-22T18:59:35.333 回答
2

您可以声明一个临时表,然后在该表中选择您将要删除的 id。

CREATE TABLE #IDS_from_tblA (id int)
INSERT INTO #IDS_from_tblA(id)
    SELECT x.id FROM tblA WHERE x.id in (select x.id from tblX x where name like N'%test%')
delete from tblA where id in (select x.id from tblX x where name like N'%test%')

(Do whatever you want to do with the ids)

DROP TABLE #IDS_from_tblA 
于 2013-02-22T19:00:52.660 回答
2

在 sql server 2008+

declare @IdList table (Id int primary key)

insert into @IDList (Id)
select x.id from tblX x where name like N'%test%'

delete from tblA where id in (select x.id from @IDList x)

如果您有超过数百条记录,则可以使用临时表而不是表变量。

于 2013-02-22T19:01:16.023 回答