如何遍历SQL中select语句返回的行列表?

Dra*_*aco 2 sql database

给出一个SQL语句:

select id from myTable
where id = -1
Run Code Online (Sandbox Code Playgroud)

如何迭代每个结果?我想为每个结果执行特定操作,例如(在伪代码中):

foreach (result from my statment)
{
  delete all rows from myOtherTable that has a value of result;
}
Run Code Online (Sandbox Code Playgroud)

我将如何编写SQL语句来执行此操作?

NB我想这样做的原因是因为我要删除的行正在被其他表引用.所以我想如果我删除引用这个特定行的所有表中的行然后删除行,一切都会好的.

Nat*_*oop 8

您不需要在SQL中进行迭代,您可以在一个语句中编写

DELETE FROM myOtherTable
WHERE myTableId IN (SELECT id FROM myTable WHERE id = -1)
Run Code Online (Sandbox Code Playgroud)

编辑:

完成第一次删除后,您可以从原始表中删除

DELETE FROM myTable WHERE id = -1
Run Code Online (Sandbox Code Playgroud)

  • 如果在myOtherTables上将外键设置为myTable并且级联删除将起作用,您甚至可能不必执行DELETE FROM myOtherTable WHERE myTableId IN(SELECT id FROM myTable WHERE id = -1),而只是DELETE FROM myTable WHERE id = -1 . (2认同)

Ogr*_*m33 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
....
Run Code Online (Sandbox Code Playgroud)

然而,SQL方法会产生来回的消息,看起来更像是:

web server ->    Find all elements matching criteria  -> database
                    and delete them.
web server <-     (delete result was ok)              <- database
Run Code Online (Sandbox Code Playgroud)