繁体   English   中英

Oracle SQL更新一个表列以及另一表的值

[英]Oracle SQL Update one table column with the value of another table

我有一个表A ,其中有一个D_DATE列,其值的格式为YYYYMMDD (我不介意日期格式)。 我也碰巧有另一个表B,其中有一个列名V_TILL 现在,我想的值更新表B的V_TILL列值D_DATE在表列的A恰好有重复也。 意思是,内部查询可以从我形成查询以更新表的位置返回多个记录。

我目前已编写此查询,但会引发错误:

ORA-01427:单行子查询返回多个行

UPDATE TAB_A t1
 SET (V_TILL) = (SELECT TO_DATE(t2.D_DATE,'YYYYMMDD')
                       FROM B t2
                      WHERE t1.BR_CODE = t2.BR_CODE
                      AND t1.BK_CODE = t2.BK_CODE||t2.BR_CODE)
WHERE EXISTS (
  SELECT 1
    FROM TAB_B t2
   WHERE t1.BR_CODE = t2.BR_CODE
   AND t1.BK_CODE = t2.BK_CODE||t2.BR_CODE)

PS: BK_CODEBK_CODEBR_CODEBR_CODE

由于我陷入了泥潭,请帮助我! 任何帮助,将不胜感激。

如果子查询返回许多值,您要使用哪个值?

如果有的话,您可以使用rownum <= 1; 如果您知道只有一个值,请使用

 SET (V_TILL) = (SELECT TO_DATE(t2.D_DATE,'YYYYMMDD')
                       FROM B t2
                      WHERE t1.BR_CODE = t2.BR_CODE
                      AND t1.BK_CODE = t2.BK_CODE||t2.BR_CODE AND ROWNUM <=1)

要么

 SET (V_TILL) = (SELECT DISTINCT TO_DATE(t2.D_DATE,'YYYYMMDD')
                       FROM B t2
                      WHERE t1.BR_CODE = t2.BR_CODE
                      AND t1.BK_CODE = t2.BK_CODE||t2.BR_CODE)

以上是解决方法。 要正确地做到这一点,您必须分析为什么获得不止一个价值。 也许需要更复杂的逻辑来选择正确的值。

我可以使用以下命令:

MERGE INTO TAB_A A
USING TAB_B B
ON (A.BK_CODE = B.BK_CODE || B.BR_CODE 
AND A.BR_CODE = B.BR_CODE AND B.BR_DISP_TYPE <> '0' 
AND ((B.BK_CODE, B.BR_SUFFIX) IN (SELECT BK_CODE,
                                        MIN(BR_SUFFIX)
                                        FROM TAB_B
                                        GROUP BY BK_CODE)))

正如许多人早先提到的那样,我错过了一个额外的条件并使其正常工作,否则上述技术可以很好地工作。

谢谢大家!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM