0

我有两个需要在数据库中更新的表。我正在从另一个数据库中的数据更新这些表。如果表 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

在我的示例中,James 不会被触动,sarah 将被移至表 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 回答