2016-09-16 1 views
0

をマージ使用してリレーショナル表を更新し、私は2つのテーブルを持っていると言う:FARMFRUIT仮定の例では

FARMが同様に構成されています

FARM_ID Size  
1   50  
2   100 
3   200 
... 

や果物がのように構成されています

Reference_ID FRUIT 
1    Banana 
1    Grape 
1    Orange 
2    Banana 
2    Strawberry 

FRUITテーブルは、Excelのパラメータ@fruitを区切りにして作成されます'/'を使用してください。

例えば、@fruit = 'バナナ/グレープ/オレンジ'

などのステートメントを使用して:

split_stringが関数である
INSERT INTO FRUIT(
Fruit, 
Reference_ID, 
) 

SELECT Fruit, Scope_IDENTITY() from split_string(@fruit, '/') 

私の目標は更新を確認することです。私はFarm_IDと@fruitを取り込み、果物に何らかの変更が加えられているかどうか確認したい。値が変更されていない場合は

1)は、何をやるいけない新しいフルーツを追加した場合の果物がある場合は、farm_ID

3)でFRUITテーブルに追加

2)敬意を表すFARM_IDの新しい区切りリストに対応しないFRUITテーブルで、FRUITテーブルから削除します。

私はMergeステートメントはおそらく動作しますが、提案には開いていると思います。不明な点があれば教えてください。

+0

@ajeh、編集を参照してください。うまくいけば – user3697498

答えて

0

新しい値、そして、私はユニークな取得する方法に引っかかっビット午前

Declare @foo tinyint 
Merge Fruit as Target 
Using (Select Fruit , @workingID From split_string(@fruit, '/') As source  (fruit, ID) 
[email protected] is just a way to get the ID from other parts of the sproc. 
ON (TARGET.fruit = source.fruit) 
WHEN MATCHED THEN 
SET @foo = 1 
WHEN NOT MATCHED 
THEN DELETE 
WHEN NOT MATCHED THEN 
INSERT INTO FRUIT(
Reference_ID, 
Fruit 
) 
VALUES(

...あなた

EDIT

かなりSQLに新しいが、マージを使用して試してみましたイムありがとうございましたあなたの入力にはファームIDに対する新しいフルーツリストが含まれています。だから、既存のものを削除してファームの新しい果物のリストを挿入する方がよいでしょう。

サンプルスクリプトを以下に示します。

--loading the input to temp table 
    SELECT Fruit,@referenceid ReferenceId -- farmid corresponding tithe fruit list 
     INTO #temp 
    FROM Split_string(@fruit,'/') 

    -- delete the existing data against the given farmid 
    DELETE FROM fruit f 
    WHERE EXISTS (SELECT 1 FROM #temp t 
     WHERE f.Reference_id=t.ReferenceId) 

    -- insert the new list 
    INSERT INTO fruit 
    SELECT fruit,referenceId 
    FROM #temp 
+0

これは、マージを使用し、マッチしたときに、ソースによってマッチしなかったとき、ターゲットとマッチしないときに、より良いでしょうか? – user3697498

関連する問題