有人可以解释这是做什么的吗?我在删除后直接引用@comps
- 文档似乎建议将已删除的行放入@comps
,这是真的吗? @comps
是一个表变量。
delete @comps
from @comps as a
where a.compcode = '43423'
答案 0 :(得分:5)
您正在阅读文档错误。要将已删除的行放入表变量,您可以使用OUTPUT
子句(请参阅示例g
in BOL)
这里语法的相关部分是
DELETE
[ FROM ]
{ <object> | rowset_function_limited
[ FROM <table_source> [ ,...n ] ]
您的查询缺少第一个可选FROM
,因此对@comps
的第一个引用是要删除的目标表。第二个(别名参考)记录在BOL中如下
FROM
<table_source>
指定其他FROM子句。 这个DELETE的Transact-SQL扩展 允许指定数据 并删除 来自表中的相应行 第一个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*/
计划如下
答案 1 :(得分:0)
你也可以写
delete from @comps where compcode = '43423'
完全等同于
答案 2 :(得分:0)
@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不知道要删除哪个@comp,a或b。
修改1 我现在看到,这可能更像是对马丁的帖子的评论。 OP不是对文档内容的回答。