我遇到以下SQL问题。它说不出来
MERGE INTO MFK_WORK_KEYS mfk
USING (
select t_1.puid AS puid,
'Cfg0AbsFamilyThread' AS domain,
t_1.pcfg0FamilyNamespace || t_2.pfnd0ThreadId AS key_value
from
PCFG0ABSFAMILYTHREAD t_1 JOIN PFND0WSOTHREAD t_2
ON t_2.puid = t_1.puid
where t_1.puid not in
(select puid from union select puid from PFND_TRACELINK)
) t
ON (t.puid = mfk.puid)
WHEN MATCHED THEN UPDATE SET
mfk.domain = t.domain,
mfk.key_value = t.key_value
WHEN NOT MATCHED THEN INSERT (
mfk.puid, mfk.domain, mfk.key_value
) VALUES (t.puid, t.domain, t.key_value);
这是在Oracle上。
我可以在数据库中看到表MFK_WORK_KEYS / PCFG0ABSFAMILYTHREAD / PFND0WSOTHREAD / PFND_TRACELINK。我不知道为什么抱怨丢失的桌子。
你们中的Reuqest分享你对此的看法。
答案 0 :(得分:0)
我不确定这在Oracle中是否与在SQL Server中相同,但在那里,受影响的表格完全由INTO
子句决定。因此,不需要在UPDATE
的分配左侧使用表名(或别名),也不需要在INSERT
的列列表中使用表名(或别名):
WHEN MATCHED THEN UPDATE SET
domain = t.domain,
key_value = t.key_value
WHEN NOT MATCHED THEN INSERT (
puid, domain, key_value
) VALUES (t.puid, t.domain, t.key_value);
答案 1 :(得分:0)
其中一个内部SQL语句是错误的。
MERGE INTO MFK_WORK_KEYS mfk USING(选择t_1.puid AS puid,' Cfg0AbsFamilyThread' AS domain,t_1.pcfg0FamilyNamespace || t_2.pfnd0ThreadId AS key_value from PCFG0ABSFAMILYTHREAD t_1 JOIN PFND0WSOTHREAD t_2 ON t_2.puid = t_1。 puid其中t_1.puid不在(从PFND_TRACELINK中选择联盟选择puid))t ON(t.puid = mfk.puid)当匹配然后更新设置mfk.domain = t.domain,mfk.key_value = t.key_value WHEN不匹配,然后插入(mfk.puid,mfk.domain,mfk.key_value)VALUES(t.puid,t.domain,t.key_value);
请注意:从PFND_TRACELINK的union select puid中选择puid无效。
当我更正它以从PFND_TRACELINK中选择puid并解雇整个SQL块时,合并就发生了。