0

私は SQL と SQL サーバーに非常に慣れていないので、次の問題について何か助けていただければ幸いです。

株価表を新しい価格で更新しようとしています。

テーブルには、株式コード、日付、価格の 3 つの列があります。

シェアコード + 日付 = PK

ご想像のとおり、数千の株式コードとそれぞれの 10 年間のデータがある場合、テーブルは非常に大きくなる可能性があります。そのため、共有 ID テーブルと呼ばれる別のテーブルを作成し、代わりに最初のテーブルで共有 ID を使用しました (整数による検索は文字列よりも高速であるため、これによりクエリが高速化されることが確実に通知されました)。

要約すると、次のように2つのテーブルがあります。

Table 1 = Share_code_ID (int), Date, Price
Table 2 = Share_code_ID (int), Share_name (string)

では、テーブルを今日の株式 ZZZ の価格で更新したいとしましょう。する必要がある:

  1. 表 2 で「ZZZ」に対応する Share_code_ID を探します。
  2. 見つかった場合は、先ほど見つけた Share_code_ID を使用して、その日付の新しい価格でテーブル 1 を更新します。
  3. Share_code_ID が見つからない場合は、両方のテーブルを更新します

ここでは、Share_code_ID が新しいコードに対してどのように生成されるかを無視しましょう。それについては後で考えます。

次の構造に基づいて大まかにマージクエリを使用しようとしていますが、何をしているのかわかりません:

MERGE INTO [Table 1]           
USING (VALUES (1,23-May-2013,1000)) AS SOURCE (Share_code_ID,Date,Price)                    

{ SEEMS LIKE THERE SHOULD BE AN INNER JOIN HERE OR SOMETHING }   

ON  Table 2 = 'ZZZ' 
WHEN MATCHED THEN UPDATE SET Table 1.Price = 1000    
WHEN NOT MATCHED THEN INSERT { TO BOTH TABLES }  

どんな助けでも大歓迎です。

4

1 に答える 1

0

http://msdn.microsoft.com/library/bb510625(v=sql.100).aspx

target table指定した ID がTable2source table に見つからない場合にアクションを実行したい場合にTable1 を使用し、source table

あなたがすでに読んだドキュメントでは、それは節に対応しています

WHEN NOT MATCHED BY SOURCE ...  THEN <merge_matched>

そして後者はに対応します

<merge_matched>::=
    { UPDATE SET <set_clause> | DELETE }

したがって、そこにあるソース テーブルに挿入することはできません。Table1に何かを挿入するときに、自動挿入にトリガーを使用できますが、適切なShared_Nameを挿入することはできません-トリガーはそれを認識しません。

だからあなたには2つの選択肢があると思います。

1) T-SQL コード ブロックを作成します - ストアド プロシージャを探します。Firebird SQL Server の EXECUTE BLOCK コマンドのように、MS SQ で匿名コード ブロックを実行するための構造もあると思いますが、確かなことはわかりません。

2) 更新可能な SQL VIEW を作成し、Table1 と Table2 を結合して最新の日付を表示します。これにより、このビューに行を挿入すると、ビューの挿入時トリガーによって実際に両方のテーブルに行が挿入されます。ビュー内のデータを更新すると、on-update トリガーによってデータが変更されます。

于 2013-05-31T16:03:10.193 に答える