MERGE期间表名无效

时间:2014-03-12 15:03:52

标签: sql oracle

我遇到以下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分享你对此的看法。

2 个答案:

答案 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块时,合并就发生了。