2012-02-22 4 views
1

差分データベースから2つのテーブル間でデータを転送したいところですが、ソーステーブルにはPostalCodeカラムに繰り返し値があります。スクリプトは、前に挿入された値を挿入し、これは私のサンプルスクリプトではないと同期を確認する必要があります。2つのデータベース間でデータを転送し、値を同期してチェックしないでください

INSERT INTO [Target] 
(
    [FirstName], 
    [LastName], 
    [PostalCode], 
) 
(
SELECT 
[Sc].[FirstName], 
[Sc].[LastName], 
CASE 
WHEN 'Check for not repeated before' THEN [Sc].[PostalCode] 
ELSE CAST(1000000000 + ROW_NUMBER() OVER(ORDER BY [Sc].[FirstName]) AS CHAR(10)) END 

FROM [Source] AS [Sc] 
); 

ので、これを処理するために、あなたの提案は何ですか?

編集

そしてまたはカーソルでスクリプトを書くための方法はありますか?私は繰り返し値を非同期でチェックするのですか?

答えて

1

代わりに、おそらくDuplicationIDと呼ばれる余分な列があります。

INSERT INTO [Target] 
(
    [FirstName], 
    [LastName], 
    [PostalCode], 
    [DuplicationID] 
) 
SELECT 
    [Sc].[FirstName], 
    [Sc].[LastName], 
    [Sc].[PostalCode], 
    ROW_NUMBER() OVER (PARTITION BY [Sc].[PostalCode] ORDER BY [Sc].[PostalCode]) 
FROM 
    [Soruce] AS [Sc] 

DuplicationIDが1のレコードは、その郵便番号の最初のインスタンスとしてカウントされます。それ以外の値は重複しています。

+0

私はあなたの答えを試してみます: '関数 'ROW_NUMBER'はORDER BYでOVER句を持つ必要があります。 ' – Saeid

+0

@Saeid - 好きなようにORDER BYを追加できます。基本的には何もしない "PostalCode"を追加しました(PostalCodeでパーティション化すると、グループ内のすべてのレコードで定義通りに同じになります)。姓やその他のフィールドの優先順位を決めることができます。それはDuplicateID 1を取得するか、DuplicateID2を取得するかなどを制御するだけです。 – MatBailie

0

たぶん、このような何か:私は強く、単一のフィールドに2つの情報をmixxingに対してお勧めします

;WITH CTE AS 
(
    SELECT 
     COUNT(*) OVER(PARTITION BY [PostalCode]) AS NbrOf, 
     ROW_Number() OVER 
        (
         PARTITION BY [PostalCode] 
         ORDER BY [PostalCode] 
       ) AS RowNbr 
     [FirstName], 
     [LastName], 
     [PostalCode], 
    FROM 
     [Source] AS [Sc] 
) 
INSERT INTO [Target] 
(
    [FirstName], 
    [LastName], 
    [PostalCode], 
) 
SELECT 
    [Sc].[FirstName], 
    [Sc].[LastName], 
    CASE 
     WHEN CTE.NbrOf>1 
     THEN CAST(1000000000+CTE.RowNbr AS VARCHAR(10)) 
     ELSE [Sc].[PostalCode] 
    END 
FROM 
    CTE 
関連する問題