Oracle11g Oracle SQL-使用2个联接进行更新

Oracle11g Oracle SQL-使用2个联接进行更新,oracle11g,Oracle11g,我刚刚加入这个论坛,关注这个论坛已经有一段时间了,我的感觉确实很好。 我有个问题,希望有人能指导我 我现在的代码 select * from T1 join T2 on T1C1 = T2C1 join T3 m on m.C3 = T2C3 join T3 n on n.C3 = T1C3 where m.C4 = 'EXHAUST' and T1C5 in ('NH', 'CA', 'FL') 我必须更新T1,设置T1C6='CLEAR' 我尝试了各种选择,但大多数都出现了错

我刚刚加入这个论坛,关注这个论坛已经有一段时间了,我的感觉确实很好。 我有个问题,希望有人能指导我

我现在的代码

select *
  from T1 join T2 on T1C1 = T2C1 join T3 m on m.C3 = T2C3 join T3 n on n.C3 = T1C3 
 where m.C4 = 'EXHAUST'
   and T1C5 in ('NH', 'CA', 'FL')
我必须更新
T1
,设置
T1C6='CLEAR'

我尝试了各种选择,但大多数都出现了错误。一个有效,但是我得到的更新记录是select语句的四倍。这是我试过的

update T1, set T1C6 = 'CLEAR' where exists (
    select *
      from T1 join T2 on T1C1 = T2C2 join T3 m on m.C3 = T2C3 join T3 n on n.C3 = T1C3
     where m.C4 = 'EXHAUST' and T1C5 in ('NH', 'CA', 'FL')
)

谢谢大家

update查询的问题是,update T1与语句中的exists子句没有关联,因此整个T1表记录的更新与其中的条件无关。如果exists子句中的任何记录,然后它将更新。因此,外部T1与内部子查询(存在)之间必须存在某种关系。请在脚本下面查找。我不知道您想要实现这一点,但它应该是这样的。请测试一下

UPDATE T1  set T1.C6 = 'CLEAR' where exists (
    select 1
      from T2 ,T3 m,T3 n 
     where T1.C1 = T2.C2
     AND   m.C3  = T2.C3
     AND   n.C3  = T1.C3
     AND   m.C4 = 'EXHAUST' 
     AND   T1.C5 IN  ('NH', 'CA', 'FL')
)
编辑这是一个奇怪的、未经优化的解决方案,上述解决方案仅供您理解

UPDATE T1  set T1.C6 = 'CLEAR' where T1.rowid IN (
select T1.rowid rd
  from T1,T2 ,T3 m,T3 n 
 where T1.C1 = T2.C2
 AND   m.C3  = T2.C3
 AND   n.C3  = T1.C3
 AND   m.C4 = 'EXHAUST' 
 AND   T1.C5 IN  ('NH', 'CA', 'FL'))

删除
T1和set
UPDATE T1
setThank Gaurav之间的逗号,但是我得到了相同的结果,即使使用您的查询,也会更新4倍多的记录。我相信我们在做同样的事情,唯一的区别是我在使用join命令,而你的没有。还有其他建议吗?@redoctober:没有,您的查询和我的查询有区别,我只是在内部查询(from子句)中包含T1表,因为我需要找到要更新的行是否满足内部查询之间的关系,您能告诉我将
T1.C1与T2.C2连接的原因吗?
@redoctober:只需做一个简单的测试,计算T1中的记录数。
select count(*)from T1
和查询中的记录数
select count(*)从T1连接T1C1上的T2=T2C1连接m上的T3 m.C3=T2C3连接n.C3=T1C3上的T3 n,其中m.C4=排气,T1C5位于('NH','CA','FL')
。第二次计数不应超过第一次计数。请检查Hi Gaurav,再次感谢您的帮助。是的,我数过了,第二个数比第一个数小,所以这部分没问题。我必须将T1C1连接到T2C2,因为我需要该连接才能继续从T3获取数据。然而,在您的SQL中,您并没有使用T1,但我们必须这样做,因为它是where语句的一部分。如果可以的话,还有其他建议吗。Thanks@redoctober:正如您在我的sql中所看到的,我在查询中考虑T1,因为我们需要了解如何将表T1与内部查询关联,这样,如果您发现很难理解相关查询,我的查询将只更新测试中第二个查询显示的记录,请在oracle doc网站上浏览一下,同时,我会更新一个奇怪但你们可以理解的答案。