2014-03-12 58 views
0

我遇到了以下SQL問題。它沒有說無效的表名duirng MERGE

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

我不確定這是否與SQL Server中的Oracle相同,但在那裏,將受到影響的表完全由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); 
0

一個內部SQL語句是錯誤的。

併入MFK_WORK_KEYS MFK USING(選擇t_1.puid AS PUID, 'Cfg0AbsFamilyThread' AS域,t_1.pcfg0FamilyNamespace || t_2.pfnd0ThreadId AS從PCFG0ABSFAMILYTHREAD T_1 key_value JOIN PFND0WSOTHREAD T_2 ON t_2.puid = t_1.puid其中T_1。 puid不在(從PFND_TRACELINK的union select puid中選擇puid))t ON(t.puid = mfk.puid)當匹配時則更新設置mfk.domain = t.domain,mfk.key_value = t.key_value當不匹配時則插入(mfk.puid,mfk.domain,mfk.key_value)VALUES(t.puid,t.domain,t.key_value);

請注意:從PFND_TRACELINK的工會選擇puid中選擇puid無效。

當我糾正它從PFND_TRACELINK中選擇puid並且已經觸發了整個SQL塊時,發生了合併。

+0

我向相關團隊表達了同樣的看法,他們確實承認這是SQL問題。 – Pavan