2015-10-28 46 views
0

我有兩種不同的存儲過程更新語句版本。最上面的一個不起作用,最下面的一個不起作用。兩個不同的更新語句 - 只有一個工作

請問你們中的任何人請提供見解,爲什麼它不?

UPDATE table1 
SET outcome = (
    SELECT outcome 
    FROM table2 
    WHERE table1.StatusID = table2.StatusID 
    AND table1.IDUser = table2.UserID 
) 

下面的工作,即使我有完全相同的約束。

UPDATE a 
SET a.outcome = b.outcome 
FROM table1 A 
INNER JOIN table2 B ON A.IDUser = B.UserID AND A.StatusID = B.StatusID 
+3

不工作怎麼樣?沒有更新,錯誤的更新,錯誤等? – jarlh

+0

更新不會返回結果;保留結果爲NULL。然而,第二個呢。 – Paul

+0

你的第二個陳述中沒有'SELECT' - 這可能是問題嗎? – bunnmatt

回答

-1
UPDATE table1 
SET outcome = (
    SELECT TOP(1)outcome 
    FROM table2 
    WHERE table2.StatusID = table1.StatusID 
    AND table2.IDUser = table1.IDUser 
) 
+1

我沒有使用參數。 – Paul

3

第一次更新將會失敗,當有更多的行中表2匹配的連接。第二次更新將從連接中爲結果選取任意值並在更新中使用該值。

這種變化的第一次更新應該工作,或者更確切地說,產生相同的結果:

UPDATE table1 
SET outcome = (
    SELECT TOP 1 outcome 
    FROM table2 
    WHERE table1.StatusID = table2.StatusID 
    AND table1.IDUser = table2.UserID 
) 

也許這會比現有的更新更好。這樣,您將有一定的控制,其價值將在表1結束在結果

UPDATE table1 
SET outcome = (
    SELECT MAX(outcome) 
    FROM table2 
    WHERE table1.StatusID = table2.StatusID 
    AND table1.IDUser = table2.UserID 
) 
1

這是正常的,第一次查詢不工作,你所希望的方式,因爲這是一個錯誤的查詢。

你的第一個代碼有一個主查詢和一個子查詢。 在你的子查詢中,你加入這些表並獲得一個結果集。 但是在你的主查詢中,你使用從子查詢返回的結果設置你的每一行,因爲你沒有where塊。該結果集中應該有一個空值。這是您更新後爲空的原因。

你必須完成你的子查詢,就像你在第二個代碼中一樣。

+0

那麼發現,這是問題,當表之間沒有匹配時,table1將更新爲null –