【问题标题】:Mysql Query Update With ConditionsMysql查询更新有条件
【发布时间】:2016-08-14 16:32:06
【问题描述】:

我有一个已加载数据的现有 Mysql 表(TblParts)

Code Stock Price Location id
1     10   1000   Global  1
2     5    1500   Office  2
3     2    500    Global  3
4     1    100    Global  4

我有一个包含新信息的第二张表(TblNewParts)

Code Stock Price Location id
1    30    2000    Global 1
2    5     1000    Global 2
3    10    5000    Global 3
4    30    200     Global 4
5    40    500     Global 5

我需要用 TblPartsNew 数据更新 TblParts

如果代码存在,并且位置 = 全球,则更新股票和价格,如果代码存在,但位置 全球,然后插入具有相同代码和不同位置的记录,如果代码不存在,则添加它

TblParts 的输出必须是:

Code Stock Price Location
1    30    2000   Global 
2    5     1500   Office 
3    10    5000   Global 
4    30    200    Global 
5    40    500    Global

【问题讨论】:

  • 您的问题是什么?你试过了吗?
  • 因为 MySql 没有 MERGE 命令,你必须编写一个 INSERT 和一个 UPDATE 查询
  • @JoeTaras 为什么? INSERT ... ON DUPLICATE KEY UPDATE 语法有什么问题?
  • @Strawberry:对!我忘记了;)
  • @JoeTaras 我想这就是他们将删除按钮放在那里的原因。

标签: mysql join conditional


【解决方案1】:

第 1 步:使用以下查询为列(代码、位置)创建 主键

alter table TblParts add constraint pk_1 PRIMARY KEY(Code,Location);

第 2 步:现在使用以下查询使用 TableNewParts 表的数据更新表

insert into TblParts(Code,Stock,Price,Location) select (Code,Stock,Price,Location) from TblNewParts on duplicate key update Stock=values(Stock),Price=values(Price);

【讨论】:

  • 谢谢,我可以使用该查询,因为 tableNewParts 的 ID 与 TblParts 不同。我需要比较代码和位置。
【解决方案2】:

试试这个:

/* if Code Exist, And Location = Global then Update Stock and Price */
UPDATE 
  tblparts p INNER JOIN tblnewparts np 
    ON np.code = p.code AND p.location = 'Global' 
SET p.price = np.price, p.stock = np.stock;

/* if Code Exist, But Location <> Global then Insert Record with Same Code */
/* and Distinct Location */ 
/* if code Not Exist then Add it */
INSERT INTO tblparts (code, stock, price, location)
  SELECT code, stock, price, location 
  FROM tblnewparts np
  WHERE NOT EXISTS ( SELECT * FROM tblparts 
                     WHERE (code = np.code AND location = np.location) 
                           OR 
                        (code= np.code)) 

不知道 ID 列代表什么。如果它是一个自动递增的键,只需在 INSERT 语句下的字段列表中添加 0:

INSERT INTO tblparts (code, stock, price, location, id)
  SELECT code, stock, price, location, 0 
  FROM tblnewparts np
  WHERE NOT EXISTS ( SELECT * FROM tblparts 
                     WHERE (code = np.code AND location = np.location) 
                           OR 
                        (code= np.code)) 

【讨论】:

    猜你喜欢
    • 2011-07-12
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 2012-08-12
    • 2011-02-13
    • 2012-07-20
    • 1970-01-01
    • 2011-11-16
    相关资源
    最近更新 更多