Как обновить строки в одной таблице на основе данных, отсутствующих в другой таблице? - PullRequest
0 голосов
/ 20 июня 2019

Я использую Microsoft SQL Server 2012.

Мне нужно обновить записи в одной таблице, основываясь на том, что записи в другой таблице либо отсутствуют, либо имеют логически удаленный флаг.

У меня есть три таблицы: товары, клиенты и цены. Цены ссылки как на ItemID и CustomerID. Записи товаров и клиентов логически удаляются из внешнего источника (а затем удаляются физически). Ценообразование происходит при изменении записей, но не при удалении записей товаров или клиентов.

Я могу использовать левое внешнее объединение для определения записей в Ценообразовании, которые должны быть логически удалены, но я не могу понять, как обновить на основе объединения. Я пытался на основе вопроса, который я нашел здесь,

Это работает и отображает записи, для которых либо запись Предметов больше не существует, либо запись Предметов помечена как логически удаленная.

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') 

Та же проблема возникает с клиентами и CustomerID.

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Попробуйте это:

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'
0 голосов
/ 20 июня 2019

Вы можете использовать:

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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...