我试图在PL/SQL中使用MERGE
语句,但遇到了Invalid Identifier错误。
merge into t082assdetail t082
using (select *
from t082assdetail t082
inner join t080assortment t080
on t082.codassortment = t080.codassortment and t082.coddiv = t080.coddiv
inner join tz084custcat tz084
on t080.z_codbanner = tz084.z_codbanner and t080.codassortmenttype = tz084.codassortmenttype and t080.coddiv = tz084.coddiv
and t082.z_custcodassortmenttype = t084.z_custcodassortmenttype) a
on (t082.codassortment = a.codassortment and t082.coddiv = a.coddiv and t082.prgassortment = a.prgassortment and t082.codart = a.codart
and t082.numprg = a.numprg and t082.z_custcodassortmenttype = a.custcodassortmenttype)
when matched then update set t082.z_custcodassortmenttype = a.zcustcodassortmenttype
这是完整的查询,错误在a.prgassortment
上触发。我相信问题是USING
子句中使用的别名在外部无法识别,但我似乎找不到绕过它的方法。
2条答案
按热度按时间41zrol4v1#
你最初得到的异常是:
这是因为表别名是
tz084
而不是t084
。一旦你解决了这个问题,你就会得到错误:
这是因为您使用了
SELECT *
,并且在您要连接的表中有多个列具有相同的标识符;而是显式命名要选择的列,这样就不会有重复的标识符:然后你会得到错误:
你不需要在
ON
子句中使用"T082"."Z_CUSTCODASSORTMENTTYPE"
,但这不是我们可以告诉你如何修复的,因为你需要弄清楚你还可以在什么地方连接表。fiddle
mzaanser2#
我怀疑星号是罪魁祸首,因为它选择了所有相关表中的所有列。关于
JOIN
与具有相同名称的列 * 匹配 *-例如这意味着
select
也返回了当你试图更新目标表的
z_custcodassortmenttype
列时,你会选择哪一个?当然,它们是匹配的,但这其中有歧义。下面是一个例子:我想从
DEPT
表中填充T_EMP.DNAME
列值:带星号的
merge
(第2行)引发您提到的错误:但是,如果您显式地声明所涉及的列,则查询工作:
结果: