0

テーブルから結果のサブセットを生成する次のクエリがあります。これらの結果は ~3000 で、ステータス テーブルには ~230,000 の卵があります。

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 ステートメントでラップします。

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, ) です。

何が間違っているのかわかりません。

4

1 に答える 1

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
于 2013-10-08T20:31:29.007 に答える