如何基于另一个表中不存在的数据更新一个表中的行?

时间:2019-06-20 18:59:01

标签: sql-server

我正在使用Microsoft SQL Server2012。

我需要基于另一个表中的记录丢失或具有逻辑删除标志来更新一个表中的记录。

我有三个表:项目,客户和定价。定价链接到ItemID和CustomerID。从外部逻辑上删除项目和客户记录(然后在以后物理删除)。记录更改时定价,但项目或客户记录被删除时定价。

我可以使用左外部联接来标识Pricing中应从逻辑上删除的记录,但是我不知道如何根据联接进行更新。我根据在这里找到的问题进行了尝试,

这有效,并显示记录,其中“项目”记录不再存在或“项目”记录被标记为逻辑删除。

SELECT p.ItemKey FROM Pricing AS p 
LEFT OUTER JOIN Items as i
on p.ItemKey = i.ItemID 
WHERE i.ItemID IS NULL OR i.deleted = 'Y'

这会将所有记录标记为已删除,而不仅仅是在上一个查询中找到的记录。

UPDATE Pricing SET deleted = 'Y' WHERE ItemKey IN 
(SELECT p.ItemKey FROM Pricing AS p 
LEFT OUTER JOIN Items as i
on p.ItemKey = i.ItemID 
WHERE i.ItemID IS NULL OR i.deleted = 'Y') 

Customers和CustomerID也会发生相同的问题。

2 个答案:

答案 0 :(得分:0)

您可以使用:

WITH cte AS (
  SELECT p.* FROM Pricing AS p 
  LEFT OUTER JOIN Items as i
    on p.ItemKey = i.ItemID 
  WHERE i.ItemID IS NULL OR i.deleted = 'Y'
)
UPDATE cte
SET deleted = 'Y'

答案 1 :(得分:0)

尝试一下:

UPDATE p SET p.deleted = 'Y'
FROM Pricing AS p 
LEFT OUTER JOIN Items AS i
on p.ItemKey = i.ItemID 
WHERE i.ItemID IS NULL OR i.deleted = 'Y'