0

私は2つのテーブルを持っています

表A

NameID  FirstName  MiddleName  LastName  Addr1  Addr2  Phn1  Phn2  City  State 
NULL      Micheal    Calvin      Dodson    12     23     1234  123  XYZ   ABC    
NULL      John       NULL        Keith     NULL   NULL   2344  NULL SQE   FDG    
NULL      John       NULL        Keith     NULL   NULL   2344  NULL SQE   FDG 
NULL      William    Stephen     NULL      45     NULL   NULL  NULL HJD   ABC
NULL      Victor     NULL        Anthony   NULL   NULL   NULL  NULL NULL  NULL

表B

NameID   FirstName  MiddleName  LastName  Addr1  Addr2  Phn1  Phn2  City State Zip Email Gender...

テーブルAの(FirstName、MiddleName、LastName)の個別のレコードを取得し、同じ詳細を、テーブルAと一致する他のフィールドとともにテーブルBに挿入する必要があります。私のテーブルBには、ID列としてNameIDがあります。したがって、一意のレコードをテーブルBに挿入した後、そのNameIDを取得して、以下に示すテーブルAに挿入し直す必要があります。

表A

表A

NameID  FirstName  MiddleName  LastName  Addr1  Addr2  Phn1  Phn2  City  State 
1         Micheal    Calvin      Dodson    12     23     1234  123  XYZ   ABC    
2         John       NULL        Keith     NULL   NULL   2344  NULL SQE   FDG    
2         John       NULL        Keith     NULL   NULL   2344  NULL SQE   FDG 
3         William    Stephen     NULL      45     NULL   NULL  NULL HJD   ABC
4         Victor     NULL        Anthony   NULL   NULL   NULL  NULL NULL  NULL

表B

NameID  FirstName  MiddleName  LastName  Addr1  Addr2  Phn1  Phn2  City State Zip  Email Gender...
1       Micheal    Calvin      Dodson    12     23     1234  123   XYZ   ABC   NULL NULL  NULL
2       John       NULL        Keith     NULL   NULL   2344  NULL  SQE   FDG   NULL NULL  NULL
3       William    Stephen     NULL      45     NULL   NULL  NULL  HJD   ABC   NULL NULL  NULL
4       Victor     NULL        Anthony   NULL   NULL   NULL  NULL  NULL  NULL  NULL NULL  NULL

これを手伝ってくれませんか。このクエリを正しく取得できません。SQLServer2008のコード

よろしくお願いします、
Sunitha

4

2 に答える 2

0

これを行う最も簡単な方法は、2つのクエリを使用することだと思います。最初の問題は、TableAでの重複の処理です。次のクエリは、名前の組み合わせごとに任意の行を選択します。

TableB()に挿入するselect()from(select a。*、row_number()over(partition by FirstName、MiddleName、LastName order by FirstName)as seqnum from TableA a)a where seqnum = 1

次に、元のテーブルを更新します。

update TableA
    set NameId = (select max(NameId) from TableB
                  where TableB.FirstName = TableA.FirstName and
                        TableB.MiddleName = TableA.MiddleName and
                        TableB.LastName = TableA.LastName
                 )
    where NameId is null

フィールドに(ブランクではなく)NULL値が含まれている場合は、結合条件にcoalesce()を使用できます。

update TableA
    set NameId = (select max(NameId) from TableB
                  where coalesce(TableB.FirstName, '<null>') = coalesce(TableA.FirstName, '<null>') and
                        coalesce(TableB.MiddleName, '<null>') = coalesce(TableA.MiddleName, '<null>') and
                        coalesce(TableB.LastName , '<null>')= coalesce(TableA.LastName, '<null>')
                 )
    where NameId is null
于 2012-06-26T15:49:16.537 に答える
0
DECLARE @results TABLE
(
  NameID INT, 
  FirstName VARCHAR(32), -- guessing on data types for these columns 
  MiddleName VARCHAR(32), 
  LastName VARCHAR(32)
);

;WITH x AS 
(
 SELECT FirstName, MiddleName, LastName, 
     rn = ROW_NUMBER() OVER (PARTITION BY FirstName, MiddleName, LastName
      ORDER BY (SELECT NULL)
   ) --, ... other columns ...
   FROM dbo.TableA
)
INSERT dbo.TableB 
(
  FirstName, MiddleName, LastName --, ... other columns ...
)
OUTPUT 
  inserted.NameID, inserted.FirstName, 
  inserted.MiddleName, inserted.LastName
INTO @results
SELECT FirstName, MiddleName, LastName --, ... other columns ...
FROM x WHERE rn = 1;

UPDATE a SET NameID = r.NameID
  FROM dbo.TableA AS a
  INNER JOIN @results AS r
  ON COALESCE(a.FirstName,'') = COALESCE(r.FirstName,'')
  AND COALESCE(a.MiddleName,'') = COALESCE(r.MiddleName,'')
  AND COALESCE(a.LastName,'') = COALESCE(r.LastName,'');
于 2012-06-26T16:50:09.497 に答える