关联子查询更新语句:单行子查询returns多行

Update statement with corelated subquery: single-row subquery returns more than one row

环境:Oracle 19

这是我的两个表 -

MainTab ( g_year, g_prd, match_col, desc) 

MainTab 在 g_year 上进行范围分区,在 g_prd

上进行子分区
LookupTab ( match_col, desc)

我想使用 LookupTab 更新 MainTab 的 desc 列。我正在对一个子分区执行以下更新查询。

update MainTab a  
SET a.desc = (SELECT distinct b.desc FROM LookupTab b 
                    where a.g_year =2005 and a.g_prd = 1 and a.desc is null 
                            and a.match_col = b.match_col and b.desc is not null )
where a.g_year =2005 and  a.g_prd = 1 and a.desc is null;

即使我在子查询中有不同的子句,这个查询也会抛出 ORA-01427 - single-row subquery returns more than one row

问题:为什么 distinct 子句和附加的 where 子句 b.desc is not null 不能阻止子查询中返回多行。

我可以使用 fetch first 1 row only 来解决这个问题,但我希望 distinct 子句也能正常工作。

你误会了DISTINCT。这不会将结果限制为一行,它只是确保每一行(完整的一行)都在结果中 DISTINCT,并且通常可以有许多不同的行。

附带说明:子查询 WHERE 中的 a.g_year =2005 and a.g_prd = 1 and a.desc is null 是没有意义的,无论如何都是真的,因为它也是外部 WHERE.[=15= 中的操作]

正如 Sticky Bit 所说,“不同”将 return 该列中的每个唯一值。单独尝试 运行 这部分,看看是否得到超过 1 行 returned。我怀疑你会:

SELECT distinct b.desc FROM LookupTab b 
                    where a.g_year =2005 and a.g_prd = 1 and a.desc is null 
                            and a.match_col = b.match_col and b.desc is not null 

同样如上文所述,您不需要两次 WHERE 子句。一处或另一处都可以。

您可能需要更具体地说明您的内部 WHERE 并删除 distinct 部分。