2016-11-16 73 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

你可以在基于集合而不是循环的基础上做到这一点。 –