有人能解释一下这是做什么的吗?我指的是delete之后的@comps -文档似乎建议它将删除的行放到@comps中,这是真的吗?@comps是一个表变量。
delete @comps
from @comps as a
where a.compcode = '43423'发布于 2011-02-08 21:10:32
你读错了文档。要将删除的行放入表变量中,可以使用OUTPUT子句(有关该内容,请参阅示例g in BOL )
这里的语法的相关部分是
DELETE
[ FROM ]
{ <object> | rowset_function_limited
[ FROM <table_source> [ ,...n ] ] 您的查询缺少第一个可选FROM,因此对@comps的第一个引用是要删除的目标表。第二个(别名引用)在BOL中记录如下
来自<table_source> <table_source>的
指定附加的FROM子句。此Transact-SQL DELETE扩展允许在第一个from子句中指定表中的数据以及从表中删除相应的行。
这个指定联接的扩展可以用来代替WHERE子句中的子查询来标识要删除的行。
但是,就解释查询中发生的情况而言,似乎缺少文档。自连接的处理方式与连接到不同表的处理方式不同。
declare @comps table (compcode char(5))
declare @T table (compcode char(5))
INSERT INTO @comps VALUES ('12345')
INSERT INTO @comps VALUES ('43423')
/*Copy the table*/
insert into @T
select * from @comps
delete @comps
from @T as a
where a.compcode = '43423'
select * from @comps /*The table is empty. For every row in @comps the
join on a.compcode = '43423' returns a match so
all rows get deleted*/
/*Add back the deleted rows*/
INSERT INTO @comps VALUES ('12345')
INSERT INTO @comps VALUES ('43423')
/*Try the self join*/
delete @comps
from @comps as a
where a.compcode = '43423'
SELECT * FROM @comps /*Returns 12345*/计划如下


发布于 2011-02-08 21:05:07
是的,你是对的。在这段代码中,"@comps“只能是一个表变量。
您还可以编写
delete from @comps where compcode = '43423'它是完全等价的
发布于 2011-02-08 21:59:13
@comps和a是使用不同别名引用的同一个表。
这也是有效的,并做完全相同的事情。
delete a
from @comps as a
where a.compcode = '43423'它是相同的,这是这个样本最好的表现
delete @comps
from @comps as a
inner join @comps as b
on a.compcode = b.compcode
where a.compcode = '43423'这会给你一个错误
Msg 8154, Level 16, State 1, Line 9
The table '@comps' is ambiguous.SQL Server不知道要从a或b中删除哪个@comps。
编辑1我现在明白了,这可能更多的是对马丁的帖子的评论。没有回答操作员关于文档中有什么的问题。
https://stackoverflow.com/questions/4933326
复制相似问题