给出一个SQL语句:
select id from myTable
where id = -1
如何迭代每个结果?我想对每个结果执行特定的操作,例如(在伪代码中):
foreach (result from my statment)
{
delete all rows from myOtherTable that has a value of result;
}
我如何编写SQL语句来执行此操作?
N.B。我想这样做的原因是因为我要删除的行正被其他表引用。所以我想如果我删除引用这个特定行的所有表中的行然后删除行,一切都会好的。
答案 0 :(得分:8)
您不需要在SQL中进行迭代,您可以在一个语句中编写
DELETE FROM myOtherTable
WHERE myTableId IN (SELECT id FROM myTable WHERE id = -1)
修改强>
完成第一次删除后,您可以从原始表中删除
DELETE FROM myTable WHERE id = -1
答案 1 :(得分:7)
其他答案基本上是正确的。良好的SQL代码通常需要一种不同于程序或面向对象程序员习惯思考的思维方式。 SQL已经过优化,可以对数据集执行操作。您的DELETE FROM table2 WHERE ...
语句将发送到后端数据库,数据库知道如何最有效地获取该语句并立即在整个结果集中执行操作。
其中一个原因是因为许多大型应用程序具有前端(用户界面),接受用户请求的服务器(例如:Web服务器)和后端数据库服务器。在Web服务器上执行的SQL代码(您的SQL脚本可能源自的源代码)必须向后端发出单个请求,以便在循环中删除表中的每个项目。从Web服务器发送到数据库服务器的消息看起来像这样(伪代码消息):
web server -> Find all elements matching criteria -> database
web server <- (return of matching elements) <- database
web server -> Delete element[0] from myTable -> database
web server <- (delete result was ok) <- database
web server -> Delete element[1] from myTable -> database
web server <- (delete result was ok) <- database
....
然而,SQL方法会产生来回的消息,看起来更像是:
web server -> Find all elements matching criteria -> database
and delete them.
web server <- (delete result was ok) <- database
答案 2 :(得分:2)
您可以使用游标,但这些游标很慢且不应使用。
你可以做的是:
DELETE FROM a
FROM
myOtherTable a
INNER JOIN myTable b ON
a.value = b.value
AND b.id = -1
我通常喜欢从:
开始SELECT a.*
--DELETE FROM a
对于我的查询,所以我可以检查结果,然后在我知道我得到正确的值时删除它们。
答案 3 :(得分:2)
可以在一次点击中执行每个“其他”表格,例如
DELETE
FROM myOtherTable
WHERE EXISTS (
SELECT *
FROM myTable AS M1
WHERE M1.SomeValue = myOtherTable.SomeValue
AND M1.ID = -1
);
答案 4 :(得分:2)
您不需要在sql中进行迭代。
DELETE FROM table2
WHERE Id IN (SELECT id FROM table1 WHERE id = -1)
如果您需要在sql中循环,可以使用
while