【问题标题】:Oracle SQL | Single-row Subquery Update returns more than one row?甲骨文 SQL |单行子查询更新返回多行?
【发布时间】:2015-09-20 00:41:53
【问题描述】:

这个问题似乎被问了很多,但我找不到任何处理更新的问题,而处理其他问题的问题也没有帮助。我觉得我遗漏了一些明显的东西,但我不能指望它。

我有以下查询来使用另一个表中的 ID 更新我的表,以启用与电子表格的匹配:

update TABLE3 set ITM_CD2 = 
(select pi.ITM_CD2
   from schema1.PI_TABLE pi,
        TABLE3 tb3
  where pi.OTHER_ITM_CD = tb3.OTHER_ITM_CD)

我实际上无法完成更新,因为我不断收到“需要单行子查询”的问题。

编辑:我应该提到 pi 表来自一个单独的模式。

编辑 2: 更多细节;这是我试图获得的一个例子:

表 3 目前有此数据,例如:

NAME ----- PRODUCT ----- ITM_CD1 ----- ITM_CD2
X          Y             11            NULL
A          B             12            NULL
C          Y             11            NULL

我正在尝试从这个项目表中附加数据,以便获得第二个 itm_cd,这将允许我将它与具有 ITM_CD2 但没有 ITM_CD1 的表进行比较。表 3 中的 NULL 将替换为匹配的 ITM_CD2。

我试图从中获取 ITM_CD2 的表如下所示:

PRODUCT ----- ITM_CD1 ----- ITM_CD2
A             10            90
Y             11            98
B             12            87

【问题讨论】:

  • 独立运行子选择,是否只返回 1 行?
  • 它确实返回不止一行。我的问题是弄清楚如何让它只返回一行。到目前为止,所有答案都没有奏效。
  • 如果您添加一些示例数据(两个表),并向我们展示预期的结果,它会更容易为您提供帮助!
  • 我添加了一些表格来说明我的意思,并解释了我想从中得到什么。希望对您有所帮助。

标签: sql oracle sql-update


【解决方案1】:

也许您想要子查询中的主 TABLE3:

update TABLE3 set ITM_CD2 = 
(select pi.ITM_CD2
   from PI_TABLE pi
  where pi.OTHER_ITM_CD = TABLE3.OTHER_ITM_CD)

【讨论】:

    【解决方案2】:

    我喜欢在这种情况下使用merge 而不是update。它使您正在读取的表和您正在写入的表之间的连接更加清晰:

    MERGE INTO table3 t3
    USING      pi_table pi
    ON         (pi.other_itm_cd = t3.other_itm_cd)
    WHEN MATCHED THEN
       UPDATE SET t3.itm_cd2 = pi.itm_cd2 
    

    【讨论】:

      【解决方案3】:

      试试这个查询

       UPDATE ( SELECT t1.Item_CD2,pi.ITM_CD2
                FROM table3 t1
                join pi_table pi on pi.OTHER_ITM_CD = t1.OTHER_ITM_CD
               )
       SET t1.Item_CD2=pi.ITM_CD2
      

      【讨论】:

      • 这不是 Oracle 的有效语法。
      • 我认为它是有效的,前提是OTHER_ITM_CD 是主键。
      猜你喜欢
      • 2019-10-02
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多