2017-12-31 86 views
0

SQLの基本を十分に取り入れることができますが、この複雑な作業には苦労しています。私はこのように3つのテーブルを設定しています。マージ時に選択ソースを使用して複数のテーブルに挿入

  • 識別子
  • 属性
  • タイプ

従業員

  • 識別子
  • hobby_id

ホビー

  • 私は従業員のテーブルに存在する特定のタイプの人から行を選択する必要が
  • 属性

をhobby_id。次に、従業員表にhobby_id(NULLではない)が設定されている場合、対応する人物行の属性を持つ趣味行を更新する必要があります。従業員の行にhobby_idがない場合は、person属性で新しいものを作成し、従業員のHobby_idを新しいIDに設定する必要があります。

私は多くのアプローチを試みました。私はCASE文を試したので、本当に面倒なIF/ELSE構文から始めましたが、挿入や更新はできません。私は現在、MERGEを使用しようとしています。なぜなら、動作するには十分に頑丈に見えるからです。私が働いている私の現在の「反復は」です:

USE MY_DB 

SET @nextHobbyId = (SELECT MAX(HOBBY_ID) FROM HOBBY) 

MERGE DBO.HOBBY AS TARGET 

USING (
    SELECT ATTRIBUTE, HOBBY_ID 
    FROM AA.PERSONe 
     INNER JOIN DBO.EMPLOYEE v 
     ON e.IDENTIFIER= v.IDENTIFIER 
) AS SOURCE (hobbyId, ATTRIBUTE) 

ON (TARGET.HOBBY_ID = SOURCE.HOBBY_ID) 

WHEN MATCHED 
THEN UPDATE SET 
    TARGET.ATTRIBUTE= SOURCE.ATTRIBUTE 

WHEN NOT MATCHED BY TARGET 
THEN INSERT (HOBBY_ID, ATTRIBUTE) 
VALUES (@nextHobbyId + 1, ATTRIBUTE); 

あなたは、私は現在、ATTRIBUTE」というエラーが出るので、私もこの反復で新しいhobby_idと従業員テーブルを更新しようとしていない見ることができます最後の行で無効な列名 "です。注意すべき

物事、趣味のIDは、IDを持っていませんが、テーブルに触れるだけのものにするために使用我々のアプリのコードのようなものを使用:そう挿入をやって、私がしようとすると、

SELECT NEXT VALUE FOR... 

を私のコードは元のコードと同時に実行されることはありませんが、私は可能な競合状態が心配です。

どうすればこの作品を作成できますか?私はそれが行く方法でない場合、マージに添付されていません。

答えて

0

私が正しく理解している場合、それはかなり簡単に行うことができます。

;with CTE as (
    select * from Person where identifier is in (select identifier from Employees 
) 

update Hobby set ... --some updates 
where hobby_id in (select hobby_id from CTE where hobby_id is not null) 

insert into Hobby 
... -- here, through join most probably you can perform insert or any other updating operation 
関連する問題