Oracle更新查询NULL错误[重复]

Posted

技术标签:

【中文标题】Oracle更新查询NULL错误[重复]【英文标题】:Oracle update query NULL error [duplicate] 【发布时间】: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 子句。 【参考方案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 对,视图需要保留密钥。您必须缺少对其中一个联接的父级的唯一约束。 ***.com/q/20143115/230471

以上是关于Oracle更新查询NULL错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

oracle中的更新语句与join [重复]

SQL 查询正在使用 NULL 值进行更新

oracle 中 number类型为null值数据怎么做更新

oracle 中 number类型为null值数据怎么做更新

oracle 中 number类型为null值数据怎么做更新

Oracle SQL - 使用 Case 语句缺少关键字错误的更新查询