2011-01-07 13 views
0

少し微妙な問題がありました。いくつかのアドバイスが必要です。私は別の2つのテーブルに分割する必要があるソースSQLテーブルを持っています。ソースには、郵便番号を含む複数の列が含まれています。SQLデータを2つのテーブルに分割する

私が行う必要があるのは、任意のアドレスの最初のインスタンスを含む行を最初のテーブルに追加し、同じアドレスの次のオカレンス(あれば)を2番目のテーブルに追加し、最初のテーブルの行のID(結合目的)。

誰でもこの方法を提案できますか?私はそれをT-SQL(MS SQL Server 2008)内にすべて保存したいと思っていますが、必要であれば、プロセスの一部としてC#を一緒にノックすることができます。

答えて

1

これらのアドレスを分割する適切なCTE(Common Table Expression)を作成することができます。あなたは多くの詳細を提供していないので、私はいくつかの列名と表名を作成しようとしました。

これを試してみてください - それはあなたのテーブルからすべての重複を削除します:

;WITH DuplicateAddr AS 
(
    SELECT 
     (list of columns you need), 
     ROW_NUMBER() OVER (PARTITION BY Street,ZipCode,City 
          ORDER BY DateLastChange DESC) 'RowNum' 
    FROM dbo.Addresses 
) 
SELECT (list of columns) 
FROM DuplicateAddr 
WHERE RowNum > 1 
GO 

このCTEを使用すると、「パーティション」あなたのデータは、列のリストに従って - あなたが使用する必要があるものを使用します。データの各パーティション(例えば、Street,ZipCode,Cityで定義された各アドレス)は、CTEで定義した順序に基づいて連続番号を取得します(可能性としてDateLastChangeを選択しました)。

RowNum = 1の行は、SELECT (columns) FROM DuplicateAddrではなく、最初のアドレスのセットを構成します。もちろん、その基準に基づいてINSERT INTO ....を実行することもできます。

RowNum > 1の行は、すべて「重複した」アドレスまたは追加のアドレスです。これを2番目のテーブルに挿入します。

+0

絶対完璧!どうもありがとうございました! – KenD

関連する問題