我有一个表A
,其中有一个值为YYYYMMDD
的列D_DATE
(我不关心日期格式)。我还碰巧有另一个表B,其中有一个列名为V_TILL
。现在,我希望用表A
中的D_DATE
列的值来更新表B的V_TILL列值,该表恰好也有重复项。这意味着,内部查询可以返回多条记录,我可以从其中形成一个查询来更新表。
我目前已经编写了这个查询,但它抛出了错误:
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_CODE
是BK_CODE
和BR_CODE
的组合
请帮助我,因为我被困在这个泥潭中!任何帮助都将不胜感激。
发布于 2016-11-30 20:52:46
如果子查询返回许多值,您希望使用哪一个值?
如果有,可以使用rownum <=1;如果知道只有一个值,则使用distinct
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)
以上是变通方法。要做到这一点,你必须分析为什么你会得到一个以上的值。也许需要更复杂的逻辑来选择正确的值。
发布于 2016-12-01 15:13:59
我使用以下命令使其正常工作:
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)))
正如许多人之前提到的,我忽略了一个额外的条件并使其正常工作,否则上面提到的技术工作得很好。
感谢所有人!
https://stackoverflow.com/questions/40888775
复制相似问题