从一个表中插入或更新数据

4
我需要从另一张表中插入多条记录,如果出现重复的键,则应该更新同一张表中的当前记录。
我在这个网站上找到了几个有用的答案,但是似乎都不能正常工作。所有的答案都返回语法错误,而我不确定这仅仅是因为我使用的界面不支持这些命令还是什么原因。如果没有重复键,这个查询语句可以正常工作。如果有人知道应该使用什么语法才能正确执行这些命令,我将非常感激!
以下是那些似乎完全符合我的需求但没能成功的语句。
REPLACE INTO
INSERT ... ON DUPLICATE KEY UPDATE
INSERT OR REPLACE INTO

这是我目前INSERT查询的示例:
USE database
GO
INSERT INTO products
(upc, name, price)
    select upc = TempTables.dbo.new_items.upc,
    name = TempTables.dbo.new_items.name,
    price = TempTables.dbo.new_items.price
FROM TempTables.dbo.new_items

你的问题标题和第一段让人感觉这是一个非常基础的问题(就像“我该如何插入?”),但是你的问题完全没有问题,也不是新手!也许你可以重新措辞一下你的问题,这样就不会吓跑可能的回答者了。 - Praxis Ashelin
非常感谢大家的回复!我模糊地记得在这里看到过一个MERGE命令,但我可能语法有误。看起来这次我成功了! - user3435419
3个回答

3
我个人喜欢MERGE语句。
create table ##new_items (upc int, name int, price int)

create table ##products
(upc int, name int, price int)

merge into ##products [tgt]
using ##new_items [src]
on [tgt].upc = [src].upc and [tgt].name = [src].name 
when matched then update set price = [src].price 
when not matched then insert (upc, name, price) 
    values ([src].upc, [src].name, [src].price)
;

要查看您正在使用的项目,您可以像这样查询

-- the items in new_items that aren't in products
select n.* from new_items n left outer join products p 
on n.upc = p.upc where p.upc is null

-- the items in new_items that are in products
select n.* from new_items n left outer join products p 
on n.upc = p.upc where p.upc is not null

当然,一旦您运行更新/插入/合并操作,您将不知道哪些项目已经存在,哪些已经被插入。如果您想知道这一点,您需要向表中添加一个“更新日期”列,并在那个时候标记它。


MERGE命令非常好用,谢谢您让我明白了语法!作为后续问题,我应该如何运行SELECT以获取表中已有的项目? - user3435419
我已经尝试回答你的问题,这样说通了吗? - Kirk Broadhurst
非常有道理。我认为我可以在更新之前运行这个选择,这可能会为我节省一些麻烦。为了提供一些背景,我正在尝试插入新项目,如果它们存在并且价格低于我正在更新的价格,我想选择它们和它们当前的价格,以便我可以在以后的时间(而不是在营业时间)运行此更新,但更新任何其他列。我现在基本上已经做到了,只是尝试让它在尽可能少的查询中运行。 - user3435419

0
我需要做的是从另一个表中插入多条记录,如果有重复的键,则更新同一表中当前的记录。
通常可以分两步完成此操作(某些SQL服务器有一种在一步中完成此操作的语法,但更通用的方法是两步)。
(assuming the key is upc):

UPDATE products
SET name = new_items.name,
    price = new_items.price
FROM products
INNER JOIN new_items
   ON products.upc = new_items.upv 

INSERT INTO products
(upc, name, price)
SELECT 
    upc,
    name,
    price
FROM TempTables.dbo.new_items
WHERE upc NOT IN 
    (SELECT upc FROM products)

0
UPDATE products  
SET name = new_items.name, price = new_items.price
FROM products JOIN new_items USING(upc);

INSERT INTO products
(upc, name, price)
SELECT upc, name, price
FROM TempTables.dbo.new_items
WHERE NOT EXISTS (SELECT 1 FROM products WHERE upc = TempTables.dbo.new_items.upc);

假设upc是您的主键

在这里,如果new_items中已经有一行包含upc,则UPDATE查询将成功。

如果不存在包含upc的行,则INSERT查询将成功。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接