首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delete后带有变量的DELETE语句

Delete后带有变量的DELETE语句
EN

Stack Overflow用户
提问于 2011-02-08 21:01:47
回答 3查看 841关注 0票数 0

有人能解释一下这是做什么的吗?我指的是delete之后的@comps -文档似乎建议它将删除的行放到@comps中,这是真的吗?@comps是一个表变量。

代码语言:javascript
复制
delete @comps
from @comps as a
where a.compcode = '43423'
EN

回答 3

Stack Overflow用户

发布于 2011-02-08 21:10:32

你读错了文档。要将删除的行放入表变量中,可以使用OUTPUT子句(有关该内容,请参阅示例g in BOL )

这里的语法的相关部分是

代码语言:javascript
复制
DELETE 
    [ FROM ] 
    { <object> | rowset_function_limited 
    [ FROM <table_source> [ ,...n ] ] 

您的查询缺少第一个可选FROM,因此对@comps的第一个引用是要删除的目标表。第二个(别名引用)在BOL中记录如下

来自<table_source> <table_source>

指定附加的FROM子句。此Transact-SQL DELETE扩展允许在第一个from子句中指定表中的数据以及从表中删除相应的行。

这个指定联接的扩展可以用来代替WHERE子句中的子查询来标识要删除的行。

但是,就解释查询中发生的情况而言,似乎缺少文档。自连接的处理方式与连接到不同表的处理方式不同。

代码语言:javascript
复制
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*/

计划如下

票数 5
EN

Stack Overflow用户

发布于 2011-02-08 21:05:07

是的,你是对的。在这段代码中,"@comps“只能是一个表变量。

您还可以编写

代码语言:javascript
复制
delete from @comps where compcode = '43423'

它是完全等价的

票数 0
EN

Stack Overflow用户

发布于 2011-02-08 21:59:13

@comps和a是使用不同别名引用的同一个表。

这也是有效的,并做完全相同的事情。

代码语言:javascript
复制
delete a
from @comps as a
where a.compcode = '43423'

它是相同的,这是这个样本最好的表现

代码语言:javascript
复制
delete @comps
from @comps as a
  inner join @comps as b
    on a.compcode = b.compcode
where a.compcode = '43423'

这会给你一个错误

代码语言:javascript
复制
Msg 8154, Level 16, State 1, Line 9
The table '@comps' is ambiguous.

SQL Server不知道要从a或b中删除哪个@comps。

编辑1我现在明白了,这可能更多的是对马丁的帖子的评论。没有回答操作员关于文档中有什么的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4933326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档