【问题标题】:Update Statement in Oracle using inner join? (copying data from table1.column1 to table2.column1)使用内部联接更新 Oracle 中的语句? (将数据从 table1.column1 复制到 table2.column1)
【发布时间】:2018-03-20 13:06:42
【问题描述】:

这是我迄今为止尝试过的(Oracle SQL):

UPDATE table1
   SET table1.ADDRESS =
          (SELECT table2.ADDRESS
             FROM table2 INNER JOIN table1 ON table1.ID = table2.ID
            WHERE     table1.ADDRESS <> table2.ADDRESS
                  AND table1.DATE BETWEEN TO_DATE ('9999-12-31')
                                         AND TO_DATE ('9999-01-21'));

(我选择的日期是随机的)

得到 ORA-1427 错误 - 单行子查询返回多个 行..

【问题讨论】:

  • 请给我们所有表格的样本数据和预期结果。
  • INNER JOIN table1 ON table1.column1 = table2.column1 WHERE table1.column1 &lt;&gt; table2.column1 - 你确定吗?
  • 查询实际上是没有意义的。您正在连接 COLUMN1 上的表,然后 - 在 WHERE 条件下 - 说它们是不同的。我怀疑应该修改 JOIN 条件。无论如何,更多信息可能会有所帮助。此外,日期 - 尽管是随机选择的 - 是无效的。首先,使用 DATE 文字(或 TO_DATE 函数,带有适当的格式掩码)。此外,31.12.9999 和 21.01.9999 之间没有任何内容(即向后)。
  • 您的子查询将永远不会在同一列中返回带有 的行 INNER JOIN 和 WHERE 子句。您是否将查询更改为发布?两个表的主键是什么?您可能需要更改 ON 以匹配主键
  • 请不要破坏您的问题。如果您想删除它,请使用删除按钮。

标签: sql oracle exception


【解决方案1】:

问题是你的子查询

SELECT table2.column1 
FROM table2 
INNER JOIN table1 ON table1.column1 = table2.column1 
WHERE table1.column1 <> table2.column1 
AND table1.column2 BETWEEN TO-DATE('9999-12-31') AND TO_DATE(9999-01-21)

返回多于一行(如错误文本所述)。您必须添加 WHERE ROWNUM &lt;= 1 或其他一些条件才能将选定的行减少到恰好一个。

【讨论】:

    【解决方案2】:

    UPDATE:

    update table1
    set    table1.address =
           ( select table2.address
             from   table2
             where  table2.id = table1.id
             and    table2.address <> table1.address )
    where  table1.date between date '9999-01-21' and date '9999-12-31'
    and    exists
           ( select 1
             from   table2
             where  table2.id = table1.id
             and    table2.address <> table1.address );
    

    可更新的内联视图(需要 table2.id 上的唯一索引或约束):

    update ( select t1.address as old_address, t2.address as new_address
             from   table1 t1
                    join table2 t2 on t2.id = t1.id
             where  t2.address <> t.address
             and    t1.date between date '9999-01-21' and date '9999-12-31' )
    set old_address = new_address;
    

    仅更新MERGE:

    merge into table1 t1
    using table2 t2
    on    (      t2.id = t1.id
            and  t2.address <> t.address 
            and  t1.date between date '9999-01-21' and date '9999-12-31' )
    when  matched then update set t1.address = t2.address;
    

    【讨论】:

      【解决方案3】:

      您使用了= operator 而不是ININ accept multiple values 其中= accepts single value.

      您的查询返回多个值。

      【讨论】:

      • 你能提供一个使用 IN 关键字的例子吗.. 因为我看不到在这种情况下实际可行的可行点..
      • 这行得通。 UPDATE table1 SET table1.column1 in (SELECT table2.column1 FROM table2 INNER JOIN table1 ON table1.column1 = table2.column1 WHERE table1.column1 table2.column1 AND table1.column2 BETWEEN TO_DATE ('9999-12-31') AND TO_DATE ('9999-01-21'));
      • 在 oracle 环境中 SET 后不能使用 IN 关键字给出“SQL 错误:ORA-00927:缺少等号”
      猜你喜欢
      • 2014-12-07
      • 1970-01-01
      • 2022-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      • 1970-01-01
      相关资源
      最近更新 更多