【问题标题】:Update Table in Oracle with value from another table with a specific condition使用具有特定条件的另一个表中的值更新 Oracle 中的表
【发布时间】:2016-07-27 05:18:58
【问题描述】:

我在 Oracle 11 中有两个表:

表ta_one:

name    | active
----------------
john    | yes
tina    | yes
mike    | yes

表ta_two:

name    | active
----------------
john    | yes
tina    | yes
tina    | no
mike    | no

我想要达到的目标如下: 我想在以下条件下使用第二个表 ta_two 中的“active”列的值更新第一个表 ta_one 中的“active”列:

  • ta_one 中“name”列中的名称与 ta_two 中的“name”匹配(例如:mike 和 mike)
  • 如果 ta_two 中有多个同名条目,则不应发生更新(例如:tina)
  • 如果表 ta_two 中的活动列中没有“否”,则不应发生更新(例如:john)

所以更新后的表 ta_one 应该是这样的:

name    | active
----------------
john    | yes
tina    | yes
mike    | no

只有 mike 的条目发生了变化,因为 tina 在第二个表中不止一次,而 johns 的条目在表 ta_two 的活动列中有一个“是”。

提前感谢您的帮助。

【问题讨论】:

  • Oracle 没有 update-join 语法,但 this question 虽然不是完全重复,但可能会给您一些指示。

标签: sql oracle


【解决方案1】:

我总是使用值 'yes' 进行更新,因为您的逻辑只会这样做。

UPDATE ta_one
SET active = 'no'
WHERE EXISTS
(
    SELECT t2.active
    FROM ta_one t1
    INNER JOIN ta_two t2
        ON t1.name = t2.name
    INNER JOIN
    (
        SELECT name
        FROM ta_two
        GROUP BY name
        HAVING COUNT(*) = 1
    ) t3
        ON t1.name = t3.name
    WHERE t2.active = 'no' AND
          ta_one.name = t1.name
);

【讨论】:

  • 您似乎缺少where 子句。如果set 子句中的查询没有返回一行怎么办? IIUC,这会出错。
  • 我已经尝试过了,它确实更新了 3 行。第一个表 ta_one 在 john 处具有 active = yes,在其他两个条目上具有空值。我认为 Mureinik 的评论是正确的。 @TimBiegeleisen 啊,我明白了,我会试试的。
  • @Gletschernadel 我又更新了,尝试重新加载你的页面。
  • @TimBiegeleisen 如果我运行它,我会得到 1 个更新的行,但表格不会改变。如果我将您的 2 yes 更改为 no 它似乎可以工作。
  • 但是将两者都更改为no 似乎与您的逻辑相矛盾。你确定你的问题措辞正确吗?
【解决方案2】:

也许以下适合:

update 
  ta_one o 
set 
  o.active='no' 
where o.name in (select name from ta_two where active='no') 
and (select count(*) from ta_two where name=o.name)=1

【讨论】:

  • 您可以将 o.active='no' 替换为 o.active=(select active from ta_two where name=o.name),但在这种情况下是一样的。如果这样做,则只有一个地方可以将值从“否”编辑为另一个值(如果您有其他示例)
【解决方案3】:

更新ta_one x 设置活动=(选择y.活动 来自 ta_two y 其中 y.name=x.name
) 不存在的地方( 选择 1 来自 ta_two y 其中 y.name=x.name 按名称分组 有 count(distinct y.active) > 1 )

【讨论】:

    【解决方案4】:
    update ta_one
       set active =
           (select active from ta_two where ta_one.name = ta_two.name)
     where 1 = (select count(1)
                  from ta_two
                 where ta_two.name = ta_one.name
                 group by name)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      • 2012-04-07
      • 2023-03-08
      相关资源
      最近更新 更多