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...
を私のコードは元のコードと同時に実行されることはありませんが、私は可能な競合状態が心配です。
どうすればこの作品を作成できますか?私はそれが行く方法でない場合、マージに添付されていません。