【问题标题】:Oracle SQL Update multiple parameterOracle SQL 更新多个参数
【发布时间】:2021-10-25 14:34:18
【问题描述】:

我有一个表,我试图根据多个 where 子句更新其单元格,但它失败了,我不明白为什么。任何人都可以看看这个并提供帮助吗?

UserID Options Sub_option Parameters
1 Name Firstname Rick
1 Name Lastname James
1 Mail Autoreply 0
1 Mail Autosignature 0
2 Name Firstname Rick
2 Name Lastname Astley
2 Mail Autoreply 0
2 Mail Autosignature 1
UPDATE Our_users
   SET Parameters = CASE
       WHEN UserID = '2' AND Options = 'MAIL' AND Sub_option = 'Autoreply' THEN '1'
       WHEN UserID = '2' AND Options = 'MAIL' AND Sub_option = 'Autosignature' THEN '0'
END

运行时,它似乎更新了所有行的“参数”。 不能在WHEN子句中使用“AND”吗?

【问题讨论】:

  • 如果UPDATE 没有WHERE 子句,它将更新所有行。
  • @The Impaler 不完全是。您可以使用 ELSE。
  • @Rezu 使用 ELSE 会产生相同的结果,但可能会非常昂贵。

标签: sql oracle sql-update


【解决方案1】:

这是因为您没有将ELSE 用于与您的CASE 不匹配的其他行:

UPDATE Our_users
   SET Parameters = CASE
       WHEN UserID = '2' AND Options = 'MAIL' AND Sub_option = 'Autoreply' THEN '1'
       WHEN UserID = '2' AND Options = 'MAIL' AND Sub_option = 'Autosignature' THEN '0'
       ELSE Parameters
   END

此查询有效,但如果您的表中有太多数据,则使用ELSE 会花费太多时间。这意味着您应该使用where 过滤您的行:

UPDATE Our_users
   SET Parameters = CASE
       WHEN UserID = '2' AND Options = 'MAIL' AND Sub_option = 'Autoreply' THEN '1'
       WHEN UserID = '2' AND Options = 'MAIL' AND Sub_option = 'Autosignature' THEN '0'
   END
WHERE UserID = '2' AND Options = 'MAIL' AND Sub_option = 'Autoreply' 
   OR UserID = '2' AND Options = 'MAIL' AND Sub_option = 'Autosignature'

【讨论】:

  • 我试过了,但我的表有 300 万多行,导致负载过重。
  • 那么你应该在where子句中添加前两行
【解决方案2】:

添加WHERE 子句以将更新操作限制为您想要的特定子集。

例如:

UPDATE Our_users
   SET Parameters = CASE
       WHEN UserID = '2' AND Options = 'MAIL' AND Sub_option = 'Autoreply' THEN '1'
       WHEN UserID = '2' AND Options = 'MAIL' AND Sub_option = 'Autosignature' THEN '0'
   END
WHERE UserID = '2' AND Options = 'MAIL' AND Sub_option = 'Autoreply' 
   or UserID = '2' AND Options = 'MAIL' AND Sub_option = 'Autosignature'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多