2013-10-08 68 views
0

我有以下查詢,它會從表中生成結果的子集。這些結果是〜3000,並有〜23萬個魚卵在狀態表:聲明試圖更新不在子選擇中的記錄

SELECT ms1.* FROM STATUS MS1 
INNER JOIN 
(
    SELECT MS.EndDate as MDT, MS.ID, MS.StatusID, MS.StartDate 
    FROM MEMBER M 
    INNER JOIN STATUS MS ON MS.ID = M.ID 
    AND MS.StartDate =(SELECT MAX(StartDate) FROM STATUS WHERE STATUS.ID = M.ID) 
    WHERE MS.EndDate IS NOT NULL 
    GROUP BY MS.ID, MS.StatusID, MS.EndDate, MS.StartDate) MS2 
ON MS1.ID = ms2.ID AND MS1.StatusID = MS2.StatusID 

正是這些記錄從我要更新的查詢返回。然後我把上面的查詢和更新語句像這樣把它包:

UPDATE STATUS 
SET EndDate = NULL 
WHERE EXISTS 
(
INNER JOIN 
(
    SELECT MS.EndDate as MDT, MS.ID, MS.StatusID, MS.StartDate 
    FROM MEMBER M 
    INNER JOIN STATUS MS ON MS.ID = M.ID 
    AND MS.StartDate =(SELECT MAX(StartDate) FROM STATUS WHERE STATUS.ID = M.ID) 
    WHERE MS.EndDate IS NOT NULL 
    GROUP BY MS.ID, MS.StatusID, MS.EndDate, MS.StartDate) MS2 
ON MS1.ID = ms2.ID AND MS1.StatusID = MS2.StatusID 
) 

我得到一個違反了創紀錄的,是不是在原來的選擇從上面唯一鍵約束,所以更新的嘗試更新行我不期望它更新。我得到的消息是:

違反UNIQUE KEY約束'UK_status_ID_ENDDATE'。不能在對象'dbo.STATUS'中插入重複鍵。重複的鍵值是(3,)。

我不知道我在做什麼錯。

回答

0

嘗試以下

update MS 
set 
    MS.EndDate = NULL 
from 
    MEMBER M 
    INNER JOIN STATUS MS 
     ON MS.ID = M.ID 
     AND MS.StartDate = (SELECT MAX(StartDate) FROM STATUS WHERE STATUS.ID = M.ID) 
WHERE 
    MS.EndDate IS NOT NULL 
+0

看上去好像這種方法將工作有點像,雖然更新仍然是由於我的數據未能問題(子查詢我開始)。現在試圖將其排除。謝謝。 – Baub