0

「tbMemeberInfo」と「tbDocument」の2つのテーブルがあります。

ドキュメントがアップロードされると、フィールドInfoIDがtbDocumentに記録されます。これは、tbMemeberInfoのPK(MemberInfoID)です。

ただし、tbMemeberInfoには重複があります。ユーザーには「AgreementNo」と「IDNumber」があり、重複するレコードにはどちらか一方しか含まれていません。

これらのレコードをマージして、「AgreementNo」と「IDNumber」を一方のレコードに挿入し、もう一方を削除する必要があります。

これが私がこれまでに試したテーブル構造とコードです...

tbMemberInfo

MemberInfoID   AgreementNo  IDNumber     DOB                  Initials  FirstName   LastName   Language      Role    CountryID     Email
861616         124346665    NULL         1976-08-24 00:00:00.000    DV   DAMIAN     Example     English      Member         1     damian.example@mail.com
866185          NULL      7608241234123  1976-08-24 00:00:00.000    DV   DAMIAN     Example     English      Member         1     damian.example@mail.com

tbDocument

DocumentID  r_object_id      DocumentTypeID   UniqueDocumentNo  ContentLength   ContentType        FileName                                      CreatedUserID     CreatedDate                 InfoID   
293787      0900d431800bc987    13            PPS156329L         1753819        application/pdf    Example_DV_PROV_APP_2009110316140300[1].pdf     362            2010-01-13 16:21:46.250       861616
293794      0900d431800bc998    530           PPS156335O         66750          image/tiff         Example, DV DRS REPORT.tif                      362            2010-01-13 16:26:48.420       861616

SQLコード

DECLARE
@MemberInfoID int
,@AgreementNo varchar(50)
,@IDNumber varchar
,@DOB datetime
,@TitleID int
,@FirstName varchar(150)
,@LastName varchar(150)
,@ModifiedDate datetime 

SELECT @AgreementNo = AgreementNo, @IDNumber = IDNumber, @FirstName = FirstName, @LastName = LastName, @DOB = DOB
FROM tbMemberInfo mi
INNER JOIN tbDocument d
ON mi.MemberInfoID = d.InfoID
WHERE (mi.AgreementNo = '') OR (mi.IDNumber = '') 

--SELECT @IDNumber = IDNumber  From tbMemberInfo mi
--INNER JOIN tbDocument d
--ON mi.MemberInfoID = d.InfoID
--WHERE (mi.AgreementNo = '') 

--SELECT @AgreementNo = AgreementNo From tbMemberInfo mi
--INNER JOIN tbDocument d
--ON mi.MemberInfoID = d.InfoID
--WHERE (mi.IDNumber  = '') AND (FirstName = @FirstName) AND (LastName = @LastName) AND (DOB = @DOB)

UPDATE tbMemberInfo
SET [IDNumber] = @IDNumber, [AgreementNo] = @AgreementNo, ModifiedDate  = GETDATE() 
FROM tbMemberInfo mi
    INNER JOIN tbDocument d
        ON mi.MemberInfoID = d.InfoID   
 WHERE (IDNumber = '') OR (AgreementNo = '') AND (FirstName = @FirstName)
        AND (LastName = @LastName) AND (DOB = @DOB)
 GROUP BY MemberInfoID

これはどれも機能していません。すべてのIDNumber列に「7」を入れます。これを行う方法に関するアイデア。重複を削除することに慣れていないので、最初にマージしたいと思います。

4

1 に答える 1

2

=''の代わりにIDNumberisNULLを使用する必要があります

where句にいくつかの問題がある場合は、次のように記述する必要があります。

WHERE (IDNumber is Null or AgreementNo is NULL) AND (FirstName = @FirstName AND LastName = @LastName AND DOB = @DOB)

私の提案は、 tbMemberInfoとまったく同じスキーマでtmpテーブルを作成することです(これは、ステップを整理し、タスクを少し単純化するのに役立ちます)。エントリを希望どおりにグループ化し、それらをtmpテーブルにマージします(私が正しく理解している場合は、FirstName、LastName、およびDateOfBirthを使用して個別のエントリを識別しています)。そして最後に、tbMemberInfoのすべてを切り捨てて、 tmpテーブルにあるもので埋めます。もう少し詳しく説明します。

INSERT INTO tmp
SELECT * FROM tbMemberInfo;

UPDATE tmp t1 INNER JOIN tbMemberInfo t2
        ON    t1.FirstName = t2.FirstName 
        AND   t1.LastName = t2.LastName 
        AND   t1.DOB = t2.DOB 
        SET   t1.AgreementNo = t2.AgreementNo 
        WHERE t1.AgreementNo IS NULL 
        AND   t1.MemberInfoID != t2.MemberInfoID;

UPDATE tmp t1 INNER JOIN tbMemberInfo t2
        ON    t1.FirstName = t2.FirstName 
        AND   t1.LastName = t2.LastName 
        AND   t1.DOB = t2.DOB 
        SET   t1.IDNumber = t2.IDNumber 
        WHERE t1.IDNumber is NULL 
        AND   t1.MemberInfoID != t2.MemberInfoID;

-- Just to make sure there are no entries left without a value
SELECT * FROM tmp WHERE IDNumber is NULL OR AgreementNo is NULL;

-- now we are going to keep the row with the lowest ID
DELETE t1 FROM tmp t1, tmp t2 
    WHERE t1.MemberInfoID < t2.MemberInfoID 
    AND   t1.FirstName = t2.FirstName 
    AND   t1.LastName = t2.LastName 
    AND   t1.DOB = t2.DOB;

-- update the InfoID intbDocument table
UPDATE tbDocument t1 JOIN tbMemberInfo t2 
           ON    t1.InfoID = t2.MemberInfoID
           JOIN  tmp t2 
           ON    t2.FirstName = t3.FirstName 
           AND   t2.LastName = t3.LastName 
           AND   t2.DOB = t3.DOB
               SET   t1.InfoID = t3.tbMemberInfoID
               WHERE t1.InfoID NOT IN (SELECT MemberInfoID FROM tmp);

TRUNCATE tbMemberInfo;

INSERT INTO tbMemberInfo
SELECT * FROM tmp;

注:私はこれらのクエリをテストせず、非常に迅速に記述したため、おそらくバグがありますが、アイデアを理解して自分で修正することができます。これらを元のデータで実行しないでください。複製を作成して、最初にテストしてください。

于 2012-08-21T17:59:20.977 に答える