2016-11-16 5 views
0

IDNumber、Birthdate、OptionおよびID列を持つメンバーテーブルがあります。 IDはGUIDであり、PKです。異なるID値を持つ同じテーブルのレコードでSQL Server 2008テーブルを更新する方法

今や、一部のメンバーはオプション1にあり、すべての列にデータ(IDNumber、Birthdate)が入っています。 一部のメンバーは他のオプションにあります。 この例では、オプション3のメンバーが、オプション1のメンバーと同じIDNumberを持っています(実際には同じメンバーで、複数のオプションがあります)。 ただし、これらのメンバーのBirthdate列は空です。 私は

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

は、どのように私はのために不足している生年月日を反映するために更新に行くか、本質的には3

オプションに反映するために、オプション1にメンバーから生年月日値に一致するように、私のテーブルを更新しようとしていますオプション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 

とエラー: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 

ではなく、メンバーは私もやってみました

サブクエリが1より大きい値を返しました。 =、!=、<、< =、>、> =、またはサブクエリが式として使用されている場合は、これは許可されません。

私が間違っている箇所を指摘するのに役立つことができますか?

+2

間違ったアプローチのようです。誕生日を何度も保管しないでください。あなたは別のテーブルが必要です! – jarlh

+0

@Nicholasだから 'Option3'のId '123'にBirthdateを' 19900101'にする必要があります。同様に、Id '234 'と' Option3'の生年月日は '19800101'に設定する必要がありますか? – Kane

+1

メンバーはメンバーテーブルに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

ループの代わりにセットベースでこれを行うことができます。 –

関連する問題