28

問題

表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 ステートメントで選択を使用するには? 1 行目で構文エラーが発生します
  2. これについてもっと良い方法はありますか?これを必要以上に複雑にしていますか?
  3. 私は何を間違っていますか?

そしてエラー:

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

4

1 に答える 1

44

あなたが持っているクエリはエラーを与えるでしょう

メッセージ 8156、レベル 16、状態 1、行 59 列「AnotherKey」が「tmpTable」に対して複数回指定されました。

これは*、using 節で using を使用しており、とAnotherKeyの両方の一部であるためです。 必要な列を指定します。また、句で使用しているため、そこに外部結合を使用する必要はありません。table2table3
keycolumnon

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;

アップデート

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

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

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

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

于 2012-10-15T20:59:39.997 に答える