【问题标题】:SQL select into delete DIRECTLYSQL 选择直接删除
【发布时间】:2016-02-17 13:53:31
【问题描述】:

我需要选择记录,检查我的选择标准并对其进行改进,直到获得所需的所有记录,然后删除(或以其他方式更改)这些记录。让我们暂时删除。

select <fields> from <database> where <condition>

(检查,调整条件)

delete from <database> where (<same condition>)

这不是一种更简单的方法,例如管道,将选定的记录直接推入删除语句吗?我使用了将所有记录号选择到临时数据库中的技术,但没有直接的方法吗?

我搜索了 Stack Overflow,发现了几个问题,人们问如何将 select 语句转换为 delete 语句,这不是我想要的。我的想法是这样的:

select ... from ... where ... | delete

或者也许像这样的解决方法......

/* create a list of records to delete */
select ... from ... where ... into @temp

/* shove the list into delete */
delete @temp  

SQL 标准是否支持我想要的机制,或者是否有特定于平台的方法(MS SQL Server)?

【问题讨论】:

  • 但是为什么要选择您不想保留的数据呢?不能直接删吗?
  • 如果您想根据某些条件选择某些内容 - 请选择。如果您想使用某些条件删除 - 请删除。为什么要费心混合它并发明新的语法、管道等等?
  • @jarlh 本质上,他以交互方式使用 SQL,因此对于他的(狭窄的)用例,以及他的特殊思维方式,这是有道理的。我想他来自脚本背景(Bash、PowerShell 等)。 OP - 如果我误解了,请随时纠正我:)
  • @RB ...这正是我的情况。

标签: sql sql-server select sql-delete


【解决方案1】:

您可以使用Common Table Expression,如下所示:

;WITH CTE AS (
   select <fields>  
   from <table> 
   where <condition>
)
DELETE FROM CTE

此语句将删除您的查询返回的所有记录

您可以选择添加应用于 CTE 查询返回的内联表的额外条件,例如:

;WITH CTE AS (
   select <fields>  
   from <table> 
   where <condition>
)
DELETE FROM CTE 
WHERE <more conditions on CTE fields>

【讨论】:

  • 这很好用,非常接近我想要的,非常感谢。棘手:没有前导“;”,表达式将无法工作...
  • ... 棘手:如果没有前导“;”,表达式将无法工作...如果我省略它,我会收到类似“WITH 关键字附近的语法错误”的消息。为什么这个?我在 Microsoft T-SQL 网站上查找了 WITH 和 CTE 语法......他们没有提到前导的“;”。但事实是,没有它,该语句将无法工作。这是为什么呢?
  • @Nimral 您刚刚遇到了 tsql 中唯一需要 ';' 的语句!您必须将其放在 WITH 之前,以防在 CTE 之前还有其他语句。
  • 啊,d****,我自己发现了。方式,在 cmets 块上方的查询编辑器窗口中,我写了一个“use ”语句,忘记了 ;那里。这就是 SQL 在下一个代码行抱怨的原因。奇怪的是,虽然它之前没有抱怨,但我可以使用 select 和 delete 语句,而“;”仍然丢失,但我不能使用 WITH 语句。
  • @Giorgios,感谢您的澄清,在我发现自己的回复后看到它。唯一需要 ; 的语句...这就是你选择神秘的原因;我猜是用符号。
【解决方案2】:

鉴于您似乎正在对数据执行某种手动操作,我建议将您所做的任何事情都包装在事务中。这将允许您在将其永久化之前查看您的声明的结果。

SELECT * FROM [table];

BEGIN TRAN

DELETE FROM [table] WHERE [predicate];
SELECT * FROM [table];

ROLLBACK TRAN
--COMMIT TRAN

【讨论】:

  • 我没有想到使用事务的好主意。非常感谢!
猜你喜欢
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 2021-11-10
相关资源
最近更新 更多