在 Oracle 中使用多行选择查询进行更新

问题描述 投票:0回答:3

任何人都可以帮我解决这个问题吗

表名称:RW_LN

  LN_ID      RE_LN_ID     RE_PR_ID   
  LN001        RN001       RN002
  LN002        RN002       RN003
  LN003        RN003       RN001  
  LN004        RN001       RN002   

我的更新查询是:

update table RW_LN set RE_LN_ID=(
    select LN_ID
    from RW_LN as n1,RW_LN as n2
    where n1.RE_LN_ID = n2.RE_PR_ID)      

我的预期结果是:

     LN_ID           RE_LN_ID  
     LN001            LN003  
     LN002            LN004  
     LN003            LN002  
     LN004            LN003  

上面的查询显示错误为

SUB QUERY RETURNS MULTIPLE ROWS
。任何人都可以提供解决方案吗,我是 Oracle 9i 的初学者。所以卡在逻辑中

oracle oracle9i
3个回答
0
投票

你可以尝试用

distinct

来解决这个问题
update table RW_LN set RE_LN_ID=(  
      select distinct LN_ID   
      from RW_LN as n1,RW_LN as n2  
      where     n1.RE_LN_ID = n2.RE_PR_ID)

如果仍然返回多行,则意味着您在某个地方缺少联接,或者可能有需要使用主键的错误架构。


0
投票

如果你想取“最大”对应的LN_ID,你可以这样做

update RW_LN r1
set r1.RE_LN_ID = (select MAX(LN_ID)
                FROM RW_LN r2
                where r1.RE_LN_ID = r2.RE_PR_ID);

参见 SqlFiddle

但是你应该解释为什么你选择(作为新的RE_LN_ID)LN004而不是LN001作为LN_ID LN002(因为你可以选择两者)


0
投票

只是猜测,但这可能就是您想要的。

update
  RW_LN n1
set
  RE_LN_ID=(  
    select n2.LN_ID   
    from   RW_LN n2  
    where  n1.RE_LN_ID = n2.RE_PR_ID)
where exists (
    select null   
    from   RW_LN n2  
    where  n1.RE_LN_ID = n2.RE_PR_ID and
           n2.ln_id is not null)

目前您正在更新的行与子查询中返回的值之间没有相关性。

查询内容如下:

For every row in RW_LN change the value of RE_LN_ID to be:
  the value of LN_ID in a row in RW_LN for which:
    the RE_PR_ID equals the original tables value of RE_LN_ID
IF there exists at least one row in RW_LN for which:
    RE_PR_ID is the same as RE_LN_ID in the original table AND
    LN_ID is not null
© www.soinside.com 2019 - 2024. All rights reserved.