ORACLE:更新多列错误:无法将字符串更新为NULL

ORACLE:更新多列错误:无法将字符串更新为NULL,oracle,sql-update,runtime-error,multiple-columns,Oracle,Sql Update,Runtime Error,Multiple Columns,我有一个简单的更新语句: UPDATE table_1 t1 SET (t1.a, t1.b, t1.c) = (SELECT t2.x, t2.y, t3.z FROM table_2 t2, table_3 t3, table_4 t4 WHERE 1 = 1 AND t2.id = t3.id AND t2.id1 = t4.id1 AND t2.name = t1.name ) WHERE EXISTS (SELECT 1 FROM t2 WHERE

我有一个简单的更新语句:

UPDATE table_1 t1 SET (t1.a, t1.b, t1.c) = 
 (SELECT t2.x, t2.y, t3.z 
  FROM table_2 t2, table_3 t3, table_4 t4
  WHERE 
  1 = 1
  AND t2.id = t3.id
  AND t2.id1 = t4.id1
  AND t2.name = t1.name
  ) WHERE EXISTS
(SELECT 1 FROM t2
 WHERE
 1 = 1
 AND t2.name = t1.name
)
内部选择查询为我提供结果。但当我执行整个更新查询时,它失败并出现错误: ORA-01407无法将%s更新为NULL 它还说,将t1.a更新为NULL是不可能的。请让我知道,如果我在这个更新查询中有任何错误

请注意,我不能使用MERGE语句,因为t2.name=t1.name条件可能会从表t2中为我提供多个条目。在这种情况下,merge语句可能会失败,错误是无法获得稳定的行集。如果有其他更好的方法,请告诉我


更新:t1.a没有空约束。我的内部查询返回的结果中t2.x不为NULL。

问题可能是,设置部分中的SQL比出口中的SQL更具选择性。如果是,请将您的存在更改为 ... 存在从中选择1 来自表2 t2、表3 t3、表4 t4 哪里 t2.id=t3.id t2.id1=t4.id1 和t2.name=t1.name
此外,如果a、b、c被定义为非空,则所有x、y或z列都应具有非空值。如果t1.a不为空,则所有x都应为非空值等。我找到了出现该错误的原因。在条件t2.name=t1.name下,我得到了表1中的两行。对于第一行,我有来自内部select查询的值t2.x。第二排我没有。因此,我得到了错误。我修改了我的查询如下:

UPDATE table_1 t1 SET (t1.a, t1.b, t1.c) = 
 (SELECT t2.x, t2.y, t3.z 
  FROM table_2 t2, table_3 t3, table_4 t4
  WHERE 
  1 = 1
  AND t2.id = t3.id
  AND t2.id1 = t4.id1
  AND t2.name = t1.name
  ) WHERE t1.id, t1.name IN
(SELECT t1.id, t1.name FROM table_2 t2, table_3 t3, table_4 t4
  WHERE 
  1 = 1
  AND t2.id = t3.id
  AND t2.id1 = t4.id1
  AND t2.name = t1.name
)

希望它能帮助其他人。

您的列很可能有一个NOTNULL约束…其中1=1使我感到恶心。这只是为了测试。我没有把它保留在我的最终代码中@Ben:我更新了my query.MUG4N,其中1=1在调试时很有用,因为它允许您对所有限制进行注释,以观察不同的结果。如果你注释掉WHERE关键字,你必须重写第一个条件from和to-WHERE,这很烦人而且需要更长的时间。