0

データベースで更新する必要がある 2 つのテーブルがあります。これらのテーブルを別のデータベースのデータから更新しています。テーブル 1 のレコードが更新された場合、テーブル 1 の古い情報をテーブル 2 に格納する必要があります。比較を行い、必要に応じてテーブル 2 を更新するためのロジックが必要です。私の質問は、これを行うための最良の方法は何ですか? ストアド プロシージャが最適な方法だと考えていますが、よくわかりません。

これはより視覚的な説明です。

    Table 1
Student    Grade
james       6
sarah       5



  Table 2
   EMPTY

以下のデータは、別のデータベースから取得したものだとしましょう。

   Other Database
  Student     Grade
   james        6
   sarah        4
   tom          7

これは、私が何をする必要があるかを説明するのに役立つかもしれないずさんなロジックです。

--If records match do nothing 
IF otherDatabase.student =  table1.student  AND  otherDatabase.grade = table1.grade THEN do nothing

--If partial match copy old data to table 2 and insert new data to table1
IF otherDatabase.student = table1.student AND otherDatabse.grade !=  table1.grade 
THEN copy table1.student to table2.student AND copy table1.grade to table2.grade THEN UPDATE table1.grade from otherDatabase.grade

--If no match copy new data to Table1
IF otherDatabase.student != table1.student AND otherDatabase.grade != table1.grade THEN INSERT otherDatabase.student AND otherDatabase.grade INTO table1

私の例では、ジェームズは触れられず、サラはテーブル 2 に移動され、新しいグレードでテーブル 1 に挿入され、トムはテーブル 1 に挿入されます。

これが意味をなさない場合は、申し訳ありません。必要に応じて明確にさせてください。ありがとう

4

2 に答える 2

1

ストアド プロシージャを使用することもできますが、トリガーを使用します。

ストアド プロシージャを使用すると、otherDatabase テーブルでカーソルを使用してレコードを読み取り、それぞれのレコードを Table1 の値と比較して、Table1 のデータを Table2 に書き込む必要があるかどうかを判断し、そうであればそれを行う必要があると思います。

トリガーを使用すると、上書きデータが何であるかを気にせずに、何らかの方法で Table1 のデータを更新するだけで済みます。トリガーでは、

##Inserted & ##Deleted (システム) テーブルを使用して古い値と新しい値を使用し、古い値 (##Deleted) を Table2 に書き込む必要があるかどうかを判断します。例えば

INSERT Table2 (Student, Grade)
SELECT d.Student, d.Grade
FROM ##Deleted d LEFT JOIN ##Inserted i ON d.[Key] = i.[Key]
WHERE (d.Student <> i.Student OR d.Grade <> i.Grade) AND d.[Key] IS NOT NULL
于 2013-09-17T03:27:41.250 に答える
0
Drop procedure if exists getCID;
delimiter // 
CREATE PROCEDURE getCID(IN cid varchar(100))
BEGIN
    create table Temp as(select i.invoice_no,i.cust_id,b.tot_amount,b.paid_amount,b.bal_amount from invoice_item_info i,bill_info b where i.invoice_no=b.invoice_no and i.cust_id=cid);
select * from Temp;
select DISTINCT cust_id,count(invoice_no),sum(tot_amount),sum(paid_amount),sum(bal_amount) from Temp;
Drop table Temp;
END
//
delimiter ;
于 2014-12-02T08:00:26.210 に答える