【问题标题】:Can I use 'in' to update field instead of '=' in SQL oracle?我可以在 SQL oracle 中使用“in”而不是“=”来更新字段吗?
【发布时间】:2016-05-19 12:53:35
【问题描述】:

我正在处理一个项目,我必须更新同一列中的多条记录。我的值存储在与我必须在 WHERE 子句中使用的 ID 相同的列表中。我想知道是否可以使用“IN”而不是“=”并更新列表中的所有值?这是我的列表代码:

<cfset listUserNum = ArrayToList(userNum)>
<cfset listUserCode = ArrayToList(userCode)>

它们看起来像这样:

listUserNum = "72,15,71,27,16,14,22";
listUserCode = "B,B,C,T,R,M,Y";

这是我的更新声明:

<cfquery name="UpdateUsers" datasource="test">
    Update Users
    Set UserCode in <cfqueryparam value="#listUserCode#" cfsqltype="cf_sql_varchar" list="yes" /> 
    Where UserNumber in <cfqueryparam value="#listUserNum#" cfsqltype="cf_sql_integer" list="yes" /> 
</cfquery>

过去我在 WHERE 子句中使用了“IN”,但从未在 SET 中使用过。让我知道我在这里做错了什么或者是否有更好的方法来做到这一点。我还没有尝试过,因为我必须更新大约 20k 条记录,并且我想确保这是我运行更新之前的最佳方式。谢谢!

【问题讨论】:

  • 否 - 您只能将字段设置为单个值,因此 in 没有任何意义。创建一个包含两列的临时表(如果查找很少更改,则为静态表),然后在更新中加入该表。
  • 我不能在我的项目中使用临时表。这就是我必须使用列表并尝试以这种方式更新我的记录的方式。那么另一种选择是什么?谢谢。
  • 可以在子查询中进行大规模联合以创建准临时表。
  • @DStanley 我以前从未这样做过。你能提供任何例子吗?谢谢。

标签: sql oracle list sql-update


【解决方案1】:

我会创建一个表来容纳该映射并在您的UPDATE 中加入它:

Update u
Set UserCode = l.UserCode
FROM Users u
INNER JOIN Lookup l
  ON u.UserNumber = l.UserNumber
Where UserNumber in <cfqueryparam value="#listUserNum#" cfsqltype="cf_sql_integer" list="yes" /> 

【讨论】:

    【解决方案2】:

    如果临时表不是选项,我只会运行 20K 更新,而不是尝试将其压缩到一个语句中。任何体面的数据库都应该没有问题处理它。

    【讨论】:

      猜你喜欢
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多