【问题标题】:Oracle update query NULL error [duplicate]Oracle更新查询NULL错误[重复]
【发布时间】:2018-11-27 15:33:45
【问题描述】:

我有 3 张桌子:

Table1
-------
ID
Field1
Field2


Table2
_______
ID
Name


Table2_OLD
____________
ID
Name

我需要将表 2 中的 ID 更新为 Table2 中的 ID,其中 Table2.Name = Table2_OLD.Name

Table2 和 Table2_OLD 中的 ID 不同,只能使用名称来获取正确的 ID:

SELECT Table2.ID 
FROM Table2 
  INNER JOIN Table2_OLD ON Table2.Name=Table2_OLD.Name

我写了如下更新声明:

UPDATE Table1 SET Table1.ID=(SELECT DISTINCT t2.ID
                             FROM Table2 t2
                               INNER JOIN Table2_OLD t3 
                                       ON t2.Name=t3.Name 
                                      AND t2.ID=Table1.ID)

但它给了我一个错误

无法将 Table1.ID 更新为 null`

我尝试过使用

UPDATE Table1 SET Table1.ID = (SELECT DISTINCT t2.ID
                               FROM Table2 t2
                                 INNER JOIN Table2_OLD t3 
                                         ON t2.Name=t3.Name 
                                        AND t2.ID=Table1.ID 
                                        AND NOT t2.ID is null)

但遇到了同样的错误。

谁能帮忙?

【问题讨论】:

  • 我认为你想要一个带有更新语句的WHERE 子句,而不是子查询。
  • 我无法从更新语句的子查询中访问任何值
  • update的语法中没有join关键字。
  • 如果您需要限制要更新的行,则在update 中添加where 子句。

标签: sql oracle join sql-update


【解决方案1】:

尚未对其进行测试,但 Oracle 中的相关更新应该可以工作:

UPDATE table1 t1
SET id = (SELECT DISTINCT t2.id
          FROM table2 t2
          JOIN table2_old t3 ON
            t2.name = t3.name
          WHERE t3.id = t1.id
          )
WHERE EXISTS (
  SELECT 1
  FROM table2 t2
  WHERE t3.id = t1.id
)

【讨论】:

  • 我稍微更改了您的查询,因为 table1 和 table2 没有以任何方式连接: UPDATE table1 t1 SET t1.id = (SELECT t2.id FROM table2 t2 JOIN table2_old t3 ON t2.name = t3 .name WHERE t3.id = t1.id ) WHERE EXISTS ( SELECT 1 FROM table2_old t3 WHERE t3.id = t1.id ) 但现在我收到一个错误,即子查询返回多个结果(ID 不是表唯一的)
  • table1和table2怎么没有连接?查看您的情况:AND t2.ID=Table1.ID。你需要那个条件,否则你会得到你得到的错误......
  • Table1 和 Table2 没有直接连接。 Table1.ID= Table2_OLD.ID 和 Table2_OLD.Name=Table2.Name。我想用 Table2.ID 更新 Table1.ID
  • 我已经更新了答案。现在可以了吗?
【解决方案2】:

如果你想JOIN更新,你可以试试这个。

UPDATE (
    SELECT t2.ID t2ID,t1.ID t1ID
    FROM Table1 t1
    INNER JOIN Table2_OLD t2Old ON t1.ID= t2Old.ID
    INNER JOIN Table2 t2 ON t2.Name=t2Old.Name 
    WHERE t2.ID is NOT null
) 
SET t1ID = t2ID

【讨论】:

  • 其实Table1和Table2没有直接联系。 Table1.ID= Table2_OLD.ID 和 Table2_OLD.Name=Table2.Name。我想用 Table2.ID 对 Table1.ID 进行 uodate
  • @CodingDuchess 好的,我编辑了我的答案,如果这没有达到您的预期,您可以提供一些示例数据并期待结果,让问题清楚:)
  • 现在我收到一个错误cannot modify a column which maps to a non key-preserved table
  • 对,视图需要保留密钥。您必须缺少对其中一个联接的父级的唯一约束。 stackoverflow.com/q/20143115/230471
猜你喜欢
  • 2019-05-20
  • 1970-01-01
  • 2014-10-07
  • 2013-08-22
  • 2013-05-03
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
相关资源
最近更新 更多