2017-02-22 8 views
0

T-SQLを使用しています。私はフルネームとSSNテーブルという2つのテーブルを持っています。 SSNテーブルには、名前、姓、およびssn列のレコードが10000以上あります。 fullnameテーブルには、姓と名の100レコードがあります。T-SQL - データを繰り返してもすべての行を更新します。

フルネームの姓名のレコードでSSNテーブルを更新したいとします。 100レコードの最後に、SSNテーブルのすべてのレコードの更新が終了するまで、名前を1行目から開始して繰り返します。私は以下のようなMERGEを試みましたが、 'MERGE文が同じ行を2回以上UPDATEまたはDELETEしようとしました'というエラーメッセージが表示されました。以下のコードでは、[last name]列を最初に更新しようとしていました。あなたは助けてもらえますか?ありがとう。

MERGE INTO [SSN] 
    USING [fullname] 
     ON 1=1 
    WHEN MATCHED THEN 
    UPDATE 
     SET [last name] = [fullname].[last name]; 
+1

:(1)右、あなたは名前がWHICH SSNに割り当てられている気にしませんが、むしろちょうど単一の名前を使用するよりも100名の回転を利用したいですか? (2)テーブルにID列が連続していますか? –

+0

(1)いいえ、問題ではありません。 SSNと一致する名前はありません。これはすべてのテストデータになります。 (2)SSNには順次ID列がありますが、必要に応じてfullnameテーブルに順次IDを追加できます。 – ray500

+0

SSNを平文で保管していないと教えてください。私はあなたがテストデータを生成していることを認識していますが、SSNは常に暗号化する必要があります。 –

答えて

1

UPDATE - 訂正と説明

両方のテーブルは、シーケンシャルのIDを持っている場合は、あなたが

ON [fullname].[ID] = [SSN].[ID] % 100 

にごON句を変更することができますアイデアは、あなたがする必要があるすべての[SSN].[ID]のために、ありますちょうど1つを[fullname].[ID]とし、%(整数除算、またはモジュロ)演算子を使用して、これを行う1つの方法を教えてください。それぞれ[fullname]は、ほぼ同じ回数記録します。それはどんな隙間なく機能するために

fullname 0 matches SSN 0, 100, 200, 300, ... 
fullname 1 matches SSN 1, 101, 201, 301, ... 

最初[ID]が1である場合は、0から99までのすべての[ID]値で[fullname]レコードを必要とする、あなたは

ON [fullname].[ID] = ([SSN].[ID] % 100) + 1 

が仮定言って、これを調整することができます[ID]が100の[fullname]レコードです。[fullname]レコードの合計数が異なる場合は、%の後に番号を変更することができます。

+0

欠落しているIDを追加することに問題がある場合は、 'row_number()over()'でそれを偽造できます。しかし、私は懐疑的です(今はテストを実行する立場ではありません) –

+0

ありがとう、私はこれを試してみますが、それは10000 +の行をすべて更新するでしょうか? – ray500

+0

ありがとう、これも働いた。 – ray500

1

これは、これらの行に沿った更新ステートメントで実行できます。これは、ssnTable.RowNumber(または実際の名前が何であれ)にギャップがないことを前提としています。ギャップがある場合は、そこにRowNumberを使用するのはかなり簡単なステップです。だから、明確にする

update s 
set LastName = fn.FullName 
from ssnTable s 
join 
(
    select ROW_NUMBER() over(order by LastName) as RowNum 
     , LastName 
    from FullName 
) fn on fn.RowNum = s.RowNumber % 100 
+0

ありがとうショーン、これは働いた! – ray500

関連する問題