我正在尝试比较不同表中的数据,插入新数据,并更新不匹配的数据。
示例:
我有桌子1------------------------------------|ITEMNO|DESCRIPTION|FORSALE|------------------------------------|123456|说明1|是|------------------------------------|234567 |说明2 |是|------------------------------------|345678 |说明3 |是|------------------------------------
我还有一个表2,它只是一个临时表
----------|项目编号|----------|123456|----------|234567|----------
ITEMNO是表1中的主键,表2中的外键
因此,当程序中的模块发送数据时,它将首先检查表2,然后将数据与表1进行比较
如果发送的数据像这个
表2表1--------------------|项目编号|--------------------|123456|=|12346|(与表1和表2匹配,然后更新(--------------------|234567|=|234567|(与表1和表2匹配,然后更新(--------------------|567890|=|567890|(然后将新数据插入表1(--------------------|345678|(不存在于表2中,但存在于表1中,因此将FORSALE字段更新为"NO"(----------
任何帮助都将不胜感激,提前表示感谢。
您可以通过以下2个sql-来实现它
UPDATE table1 AS t1
LEFT JOIN table2 AS t2 ON t1.itemno=t2.itemno
SET t1.FORSALE='No'
WHERE t2.itemno IS NULL;
INSERT IGNORE INTO table2 (itemno) SELECT t1.itemno
FROM table1 AS t1
LEFT JOIN table2 AS t2 ON t1.itemno=t2.itemno
WHERE t2.itemno IS NULL;
但更好的选择是使用存储过程,它将首先从下面的查询中获得不匹配的itemno,并将其保存在光标中,然后根据主键进行更新和插入,这样您就可以避免锁定-
SELECT t1.itemno
FROM table1 AS t1
LEFT JOIN table2 AS t2 ON t1.itemno=t2.itemno
WHERE t2.itemno IS NULL;
您需要2个查询。你可以试试这个:
//NEW DATA THEN INSERT INTO TABLE 1
insert into table1(item_no,description)
select item_no,description
from table2
where item_no not in(
select item_no from table1
);
和
//DOESN'T EXIST IN TABLE2 BUT EXISTS IN TABLE 1 SO UPDATE FORSALE FIELD TO "NO"
update table1
set forsale = 'NO'
where item_no not in(
select item_no from table2
)
并且如果CCD_ 1匹配则没有动作。