关联子查询更新语句:单行子查询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
部分。
环境: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
部分。