【问题标题】:Possibility of foreach in SQL?SQL中foreach的可能性?
【发布时间】:2014-02-03 16:39:41
【问题描述】:

我目前遇到了 SQL 问题。

我有两张桌子。第一个包含一个 int 值和一个帐户的 int ID,第二个包含一些用户数据和值,我想更新。

  1. 表:

    TABLE (INT AccountID, INT ValueToAdd)
    
  2. 表:

    TABLE (INT AccountID, INT ValueToBeUpdated, ...)
    

我希望 SQL 从 2. 表中查看它需要的 AccountID 的 1. 表,然后应该更新 ValueToBeUpdated 值,其中 1.table.AccountID = 2.table.AccountID

我希望你明白我的意思。我还没有找到一种方法来使用像 SQL 这样的面向集合的语言来执行此操作,因为我无法通过如下表中的一个表执行 foreach 循环:

foreach (row in 2.table)
{
  if (row.AccountID IN 1.table.AccountID)
  {
     UPDATE row SET ValueToBeUpdated = (SELECT ValueToAdd FROM 1.table WHERE AccountID = row.AccountID)
  }
}

希望你能帮帮我:)

【问题讨论】:

  • 您正在考虑循环结构。将 SQL 更像是基于集合的操作。对于这个,您实际上可以在UPDATE 命令中加入其他表。检查这个重复的答案:stackoverflow.com/questions/2334712/…
  • WHILE 循环和使用游标的迭代解决方案在sql 中是可能的,但如果基于集合的解决方案可用,则应始终避免。

标签: sql sql-server foreach


【解决方案1】:

忘记循环,你可以为你的情况这样做:

UPDATE
    row
SET
    r.ValueToBeUpdated.col1 = t.ValueToAdd
FROM
    row r
INNER JOIN
    table t
ON
    t.AccountID = r.AccountID

参考文献

Why are relational set-based queries better than cursors?

Understanding “Set based” and “Procedural” approaches in SQL

【讨论】:

  • 好的,我对 1.table 的数据有一个复杂的选择查询,导致 3 个 INNER JOIN 的结果已经存在。但是我现在给自己做了一个临时表,我首先将这些数据存储在其中,现在你的建议有效。谢谢:)
【解决方案2】:

无需使用 foreach 循环即可轻松执行。

UPDATE table2 SET ValueToBeUpdated = a.ValueToAdd
FROM table2 b INNER JOIN table1 a 
ON a.AccountID = b.AccountID

【讨论】:

  • 为什么不使用 JOIN?这是人为地难以理解的。这就像一个代码混淆竞赛条目。
猜你喜欢
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
相关资源
最近更新 更多