2016-11-16 70 views
0

我有一個IDNumber,Birthdate,Option和ID列的成員表。該ID是一個GUID,是PK。如何使用具有不同ID值的同一表中的記錄更新SQL-Server 2008表

現在,一些議員在方案1和都充滿了數據(IDNumber中,生日)列。 部分會員在其他選項中。 在此示例中,選項3上有成員與選項1上的成員具有相同的ID號(實際上它們是相同成員,具有多個選項)。 但是,這些成員的Birthdate列是空的。 我想更新我的表,以匹配選項1來自會員的生日值,以反映期權3.

從本質上說,

Option |IDNumber |Birthdate 
----------------------------------- 
1  |123  |19900101 
1  |234  |19800101 
3  |123  | 
3  |234  | 

我怎麼會去更新,以反映失蹤的生日選項3? 我至今嘗試:

DECLARE @temp TABLE (
    --birthdate int, 
    idnumber VARCHAR(13) 
) 

INSERT INTO @temp (idnumber) 
SELECT IDNumber 
FROM Member 
WHERE 
OPTION = 1 
    AND IDNumber IN (SELECT IDNumber FROM Member WHERE OPTION = 3) 

UPDATE Member 
SET BirthDate = m2.BirthDate 
FROM Member m2 
INNER JOIN @temp m ON m.idnumber = m2.IDNumber 
WHERE 
OPTION = 3 

它說這影響了記錄,但不屬於期權成員3

我也試圖做的事:

update member set BirthDate = (select BirthDate from Member where 
Option=1 and IDNumber in(select IDNumber from Member 
where Option=3)) 
where Option=3 

它返回錯

子查詢返回多個值。當子查詢遵循=,!=,<,< =,>,> =或當子查詢用作表達式時,這是不允許的。

請你能在指出我在那裏出了錯幫助?

+2

似乎是錯誤的方法。不要多次存儲生日。你需要一個單獨的桌子! – jarlh

+0

@Nicholas,所以你需要Id'123'作爲'Option3'必須具有生日到'19900101'。類似的,Id' 234'和'Option3'的出生日期應該設置爲'19800101'? – Kane

+1

成員只應在您的會員表中出現一次,並且您應該有一個相關的選項表,它鏈接在會員ID上。您的設計不正確,這是您遇到此問題的原因。 – Tanner

回答

0
UPDATE member SET Birthdate = A.Birthdate 
    FROM 
    (
     SELECT tOption ,IDNumber ,Birthdate 
     FROM member 
     WHERE Birthdate > 0 
    ) A WHERE A.IDNumber = member.IDNumber AND member.Birthdate = 0 
+0

。在這種情況下,你最適合我。將保留其他人以供將來使用。感謝所有 –

0

試試下面的一個。正常工作如果我從你的問題中瞭解的是正確的。

;WITH CTE AS(
    SELECT M3.ID ,M1.BIRTHDATE FROM MEMBER M1 
    INNER JOIN MEMBER M3 ON M1.IDNUMBER = M3.IDNUMBER AND M1.OPTION=1 AND M3.OPTION=3 
    ) 

    UPDATE MEMBER SET MEMBER.BIRTHDATE = CTE.BIRTHDATE WHERE MEMBER.ID =CTE.ID 
0

您可以使用光標。這看起來像這樣

DECLARE @idNumber int, @birthdate datetime 

    DECLARE oprtion1_cursor CURSOR FOR 
    SELECT IdNumber,Birthdate 
    FROM Members WHERE Option = 1 

    OPEN oprtion1_cursor 

    FETCH NEXT FROM oprtion1_cursor 
    INTO @idNumber , @birthdate 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
    UPDATE Members SET Birthdate = @birthdate WHERE IDNumber = @idNumber AND Option = 3 

    FETCH NEXT FROM oprtion1_cursor 
    INTO @idNumber , @birthdate 

    END 

    CLOSE oprtion1_cursor; 
    DEALLOCATE oprtion1_cursor; 
+1

你可以在基於集合而不是循環的基礎上做到這一點。 –