2012-05-22 71 views
0

我有這個連接:加入計算不起作用?

UPDATE Table_Name 
SET Change = isnull(tab2.Value,0) - tab1.Value 
FROM 
    (SELECT Date,ID,ID,FileName,Value FROM Table_Name WHERE FileName = 'x' AND Date = '2012-05-17') tab1 
LEFT OUTER JOIN 
    (SELECT Date,ID,TradeID,FileName,Value FROM Table_Name WHERE FileName = 'x' AND Date = '2012-05-18') tab2 
ON tab1.FileName = tab2.FileName AND 
tab1.ID = tab2.ID AND 
tab1.ID = tab2.ID 

正如你所看到的,它是一個左外連接。但是,如果我有5月17日的數據,而5月18日沒有數據,則插入的值應該是-17th.Value(因爲一般計算爲18th.Value - 17th.Value和18th.Value將爲零)。

如果我在插入部分的下面放置一個select語句(用於調試),這顯示正確,但是,當我刪除SELECT語句並在SET部分執行計算時,它不起作用。我最終得到了null的變化值,在那裏找不到五月十八日的匹配。

編輯:我應該加我不確定我是否需要左連接或左外連接。我希望返回tab1中的所有行,如果它不存在於tab2中,則Change值應該是-tab1.Value,而不是tab2.Value - tab1.Value。

+0

您正在對第一個值進行ISNULL檢查而不是第二個值,這可能是一個問題嗎? –

+0

@PaulMcCowat'EXISTS'不允許他從該表中取回數值。他不會在第二個字段有'NULL',因爲它是源表而不是'JOIN'ed表 – JNK

+0

在tab2.value是NULL的計算中你得到了什麼值? – JNK

回答

0

DB2不允許UPDATE(或DELETE)包含主表引用子句中的任何連接,這是我腦海中防止某些類型的問題的原因。是的,我知道你在使用SQL Server,這就是爲什麼你要這樣做 - 我只是傾向於用DB2約束來記錄事情。

假設你想更新第17行的行,我相信下面的工作。否則,請指定您實際想要更新的行。

UPDATE Table_Name 
SET change = -value + COALESCE((SELECT nxt.value 
           FROM Table_Name nxt 
           WHERE nxt.fileName = table_name.fileName 
           AND nxt.id = table_name.id 
           AND nxt.scenarioId = table_name.scenarioId 
           AND nxt.cobDate = '2012-05-18'), 0) 
WHERE fileName = 'GBP.csv' 
AND cobDate = '2012-05-17' 

編輯: 以上校正的錯誤。

但是......從事物的聲音,你可能會試圖更新不存在的行;具體而言,'結果需要進入18日'。如果你正在做的是試圖更新那些存在的第18行的那些行,或者如果他們不存在,插入它們,你將需要兩個語句(或者可能是MERGE?除了我沒有在我的版本,所以我不能幫你):

UPDATE Table_Name 
SET change = value - COALESCE((SELECT prev.value 
           FROM Table_Name prev 
           WHERE prev.fileName = table_name.fileName 
           AND prev.id = table_name.id 
           AND prev.scenarioId = table_name.scenarioId 
           AND prev.cobDate = '2012-05-17'), 0) 
WHERE fileName = 'GBP.csv' 
AND cobDate = '2012-05-18'; 

INSERT INTO Table_Name (id, scenarioId, fileName, cobDate, value, change) 
         SELECT id, scenarioId, fileName, '2012-05-18', 0, -value 
         FROM Table_Name 
         WHERE fileName = 'GBP.csv' 
         AND cobDate = '2012-05-17' 
         AND NOT EXISTS (SELECT '1' 
             FROM Table_Name nxt 
             WHERE nxt.fileName = table_name.filename 
             AND nxt.id = table_name.id 
             AND nxt.scenarioId = table_name.scenarioId 
             AND nxt.cobDate = '2012-05-18'); 

MUST運行它們的順序
也必須鎖定表用於兩者語句合併運行,有一些其它方法來確保包含相關數據沒有行被修改(INSERT版,UPDATE d,DELETE d),或者能夠告訴哪些行不是接觸。

如果這不是你想要的行爲,請修改你的問題,以更清楚你想要完成的事情。

+0

您好Z-Zero,語法'as origin'和',0''(後者可能是前一個錯誤的後果)似乎存在一個小問題? – mezamorphic

+0

關於這些錯誤,在COALESCE之後它是一個缺失的支架,我無法獲得'作爲起點'的工作。我取代了「起源」。這與「Table_Name」。 – mezamorphic

+0

我不認爲這是我正在尋找的。減法的結果實際上需要在18日輸入,重點在左加。我試着編輯你的SQL,但我無法做到這一點:s(可能是我的錯誤!) – mezamorphic