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 中 number类型为null值数据怎么做更新
oracle 中 number类型为null值数据怎么做更新