web-dev-qa-db-ja.com

マージステートメントで結合を使用する

問題

表1:

| KeyColumn | DataColumn1 | DataColumn2|  
   01         0.1          0.2
   02         0.13         0.41

表2:

| anotherKey | DataColumn1 | DataColumn2|      
   A1          .15          1.2
   A2          .25          23.1

表3:

|KeyColumn| anotherKey |       
  01        A1
  02        A1

キー(A1またはA2)が与えられた場合、表1のDataColumn1列とDataColumn2列を、表2の対応する値で更新する必要があります。

したがって、上記のデータに示すように、table1ではx個の行を更新できます。 A1を更新する場合、01行と02行の両方を更新する必要があります

(したがって、table1の値は、キー01と02の両方で、datacolumn1の場合は0.15、datacolumn2の場合は1.2になります)

これまでに試したこと:

MERGE table1
USING (SELECT *
       FROM table2
       LEFT OUTER JOIN table3
           on table2.anotherKey = table3.anotherKey
       WHERE table2.anotherKey = 'A1') tmpTable
ON 
   table1.keyColumn = tmpTable.keyColumn
WHEN MATCHED THEN
       UPDATE
       SET table1.DataColumn1 = tmpTable.DataColumn1
            ,table1.DataColumn2 = tmpTable.DataColumn2;

質問:

  1. これは許可されていますか? usingステートメントでselectを使用するには? 1行目に構文エラーが表示されます
  2. これについてより良い方法はありますか?これを必要以上に複雑にしていますか?
  3. 私は何を間違えていますか?

そしてエラー:

メッセージ102、レベル15、状態1、行1 'a'付近の構文が正しくありません。メッセージ102、レベル15、状態1、行12「d」付近の構文が正しくありません。

22
Steve's a D

あなたが持っているクエリはエラーを与えます

Msg 8156, Level 16, State 1, Line 59
The column 'AnotherKey' was specified multiple times for 'tmpTable'.

これは、using句で*を使用しており、AnotherKeytable2table3の両方の一部であるためです。
必要な列を指定します。また、keycolumnclauseでonを使用しているため、外部結合を使用する必要はありません。

MERGE table1
USING (SELECT table3.keycolumn,
              table2.DataColumn1,
              table2.DataColumn2
       FROM table2
       INNER JOIN table3
           ON table2.anotherKey = table3.anotherKey
       WHERE table2.anotherKey = 'A1') tmpTable
ON 
   table1.keyColumn = tmpTable.keyColumn
WHEN MATCHED THEN
       UPDATE
       SET table1.DataColumn1 = tmpTable.DataColumn1
            ,table1.DataColumn2 = tmpTable.DataColumn2;

更新

実際のエラーを投稿することは常に役立ちます。

Msg 102, Level 15, State 1, Line 1 Incorrect syntax near 'a'. Msg 102, Level 15, State 1, Line 12 Incorrect syntax near 'd'.

SQL Server 2005を使用しているようです。Mergeは SQL Server 2008 から利用できます。

SQL Serverのバージョンは、select @@versionで確認できます。

32
Mikael Eriksson