SQL select 直接删除
SQL select into delete DIRECTLY
我需要 select 条记录,检查我的 select 标准并增强它直到我得到我需要的所有记录,然后删除(或以其他方式更改)那些。让我们暂时删除。
select <fields> from <database> where <condition>
(检查、调整条件)
delete from <database> where (<same condition>)
这不是更简单的方法吗,例如管道,将 selected 记录直接推入 delete 语句?我使用技术 select 将所有记录编号输入临时数据库,但是没有直接的方法吗?
我搜索了 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 服务器)?
您可以使用 Common Table Expression
,像这样:
;WITH CTE AS (
select <fields>
from <table>
where <condition>
)
DELETE FROM CTE
此语句将删除您的查询返回的所有记录。
您可以选择添加应用于 CTE 查询返回的内联 table 的额外条件,例如:
;WITH CTE AS (
select <fields>
from <table>
where <condition>
)
DELETE FROM CTE
WHERE <more conditions on CTE fields>
鉴于您似乎正在对数据执行某种手动操作,我建议将您所做的任何事情包装在事务中。这将允许您在将声明永久化之前查看声明的结果。
SELECT * FROM [table];
BEGIN TRAN
DELETE FROM [table] WHERE [predicate];
SELECT * FROM [table];
ROLLBACK TRAN
--COMMIT TRAN
我需要 select 条记录,检查我的 select 标准并增强它直到我得到我需要的所有记录,然后删除(或以其他方式更改)那些。让我们暂时删除。
select <fields> from <database> where <condition>
(检查、调整条件)
delete from <database> where (<same condition>)
这不是更简单的方法吗,例如管道,将 selected 记录直接推入 delete 语句?我使用技术 select 将所有记录编号输入临时数据库,但是没有直接的方法吗?
我搜索了 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 服务器)?
您可以使用 Common Table Expression
,像这样:
;WITH CTE AS (
select <fields>
from <table>
where <condition>
)
DELETE FROM CTE
此语句将删除您的查询返回的所有记录。
您可以选择添加应用于 CTE 查询返回的内联 table 的额外条件,例如:
;WITH CTE AS (
select <fields>
from <table>
where <condition>
)
DELETE FROM CTE
WHERE <more conditions on CTE fields>
鉴于您似乎正在对数据执行某种手动操作,我建议将您所做的任何事情包装在事务中。这将允许您在将声明永久化之前查看声明的结果。
SELECT * FROM [table];
BEGIN TRAN
DELETE FROM [table] WHERE [predicate];
SELECT * FROM [table];
ROLLBACK TRAN
--COMMIT TRAN