首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用单个Replace语句更新表

使用单个Replace语句更新表
EN

Stack Overflow用户
提问于 2013-11-18 14:11:10
回答 1查看 59关注 0票数 0

插入物包括:

代码语言:javascript
复制
-- services ------------------
insert into upd_services values
  ( 100, 'Consult- no charge',            0.00)
, ( 101, 'Routine Exam- Bird',           35.00)
, ( 102, 'Followup Exam-Bird',           32.00)
, ( 103, 'Routine Exam-Feline',          50.00)
, ( 104, 'Followup Exam-Feline',         45.00)
, ( 105, 'Routine Exam-Reptile',         25.00)
, ( 106, 'Followup Exam-Reptile',        23.00)
, ( 107, 'Rabies_V-2008 SFall-Canine',   15.00)
, ( 108, 'Rabies_V-2008 SFall-Feline',   15.00)
, ( 109, 'Rabies_Ve-2008 Spring-Canine', 25.00)
, ( 110, 'Rabies_V-2008 Spring-Feline',  25.00)
, ( 111, 'Rabies_V-Rodent',              20.00)
, ( 112, 'Rabies_V-2008 Winter-Canine',  15.00)
, ( 118, 'First Feline PCR',             20.25)
, ( 119, 'Second Feline PCR',            20.25)
, ( 120, 'Third Feline PCR',             20.25)
, ( 121, 'Flu Rhino Vacc',               26.00)
, ( 122, 'Scaly Mite',                   35.00)
, ( 123, 'Intestinal Parasite Screen',   26.00)
, ( 124, 'Tick Removal',                 15.00)
, ( 125, 'Behaviour Modification',       75.00)
, ( 126, 'Vitamin E- Concentrated',      30.00)
, ( 127, 'Sedative-Feline',              25.00)
, ( 128, 'Flea Treatment- Small Animal', 35.00)
, ( 129, 'Flea Treatment- Large Animal', 50.00)
, ( 143, 'Rabies_V-2010 SFall-Canine',   15.00)
, ( 144, 'Rabies_V-2010 SFall-Feline',   15.00)
, ( 145, 'Rabies_V-2010 Spring-Canine',  25.00)
, ( 146, 'Rabies_V-2010 Spring-Feline',  25.00)
, ( 147, 'Rabies_V-2010 Winter-Canine',  15.00)
;

insert into upd_services_changes values

  ( 128, 'Flea Treatment- Small Animal', 45.00)  
, ( 111, '',                             35.25) 
, ( 122, 'Scaly Mite Powder',             null) 
, ( 138, 'Flu Rhino Vaccine enhanced',  125.00) 
, ( 124, null,                           25.95) 
, ( 129, 'Flea Treatment- Large Animal', 65.00)  
, ( 136, 'Hazardous Materials Disposal', 10.50) 
, ( 126, 'Vitamin E- Concentrated',      45.00)
, ( 106, '',                             30.00)
, ( 105, Null,                           35.00); 

我的目标是只更新现有的ID,我已经做到了。此外,我不需要更改服务表中的描述,如果它是空的,也不需要更改价格字段,但我被卡住了。这就是我到目前为止所知道的:

代码语言:javascript
复制
replace into upd_services 
select * from upd_services_changes
where .....

REPLACE INTO upd_services (srv_id, srv_desc, srv_list_price) 
values  
  ( 128, 'Flea Treatment- Small Animal', 45.00)  
, ( 111, '',                             35.25) 
, ( 122, 'Scaly Mite Powder',             null) 
, ( 124, null,                           25.95) 
, ( 129, 'Flea Treatment- Large Animal', 65.00)  
, ( 126, 'Vitamin E- Concentrated',      45.00)
, ( 106, '',                             30.00)
, ( 105, Null,                           35.00); 
EN

回答 1

Stack Overflow用户

发布于 2013-11-18 14:23:39

由于您的目标是...to仅对现有ID进行更新...请尝试使用UPDATE

代码语言:javascript
复制
UPDATE upd_services t JOIN upd_services_changes c
    ON t.srv_id = c.srv_id
   SET t.srv_desc = COALESCE(c.srv_desc, t.srv_desc),
       t.srv_list_price = COALESCE(c.srv_list_price, t.srv_list_price);

这是演示

或者,如果upd_services_changes还包含新记录,并且您希望将它们与对现有记录的更新一起插入到upd_services中,则

代码语言:javascript
复制
REPLACE INTO upd_services (srv_id, srv_desc, srv_list_price)
SELECT c.srv_id, COALESCE(c.srv_desc, t.srv_desc), COALESCE(c.srv_list_price, t.srv_list_price)
  FROM upd_services_changes c LEFT JOIN upd_services t
    ON c.srv_id = t.srv_id;

这是演示

或者使用IMHO更合适的ON DUPLICATE KEY语法

代码语言:javascript
复制
INSERT INTO upd_services (srv_id, srv_desc, srv_list_price)
SELECT c.srv_id, COALESCE(c.srv_desc, t.srv_desc), COALESCE(c.srv_list_price, t.srv_list_price)
  FROM upd_services_changes c LEFT JOIN upd_services t
    ON c.srv_id = t.srv_id
ON DUPLICATE KEY UPDATE srv_desc = VALUES(srv_desc), 
                        srv_list_price = VALUES(srv_list_price);

这是演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20041214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档