Хранимая процедура SQL для обновления столбца таблицы путем вычисления разницы с 2 другими таблицами - PullRequest
0 голосов
/ 01 июля 2019

У меня в SQL Server 3 одинаковые таблицы. Я пытаюсь написать хранимую процедуру, чтобы получить значение 2 столбцов из 2 таблиц и обновить 3-ю таблицу с разницей. Это 3 таблицы:

Текущее Предлагаемый Final

Я передаю rfds_processing_id. Он похож на номер заказа и содержит несколько строк, поэтому необходимо выполнить сопоставление по rfds_processing_id, типу, сектору и позиции.

Мне нужно сопоставить каждую строку из 3 таблиц, а затем вычесть значение Current.qty из Final.qty и обновить Proposed.qty с разницей. Также необходимо обновить Proposed.model со значением Final.model (когда Proposed.qty> 0). В настоящее время он устанавливает в каждой строке одно и то же значение. Я предполагаю, что мне нужно перебрать строки. Как это должно выглядеть?

ALTER PROCEDURE [dbo].[CalculateProposedAntennas]
(
  @rfds_processing_id uniqueidentifier = null,
  @id uniqueidentifier OUTPUT
)
AS
BEGIN
  SET NOCOUNT ON

UPDATE P 
  SET qty = (F.qty - C.qty) , model = F.model
  FROM Proposed_Antenna P
  INNER JOIN Final_Antenna F
      ON P.rfds_processing_id = F.rfds_processing_id
  INNER JOIN Current_Antenna C
      ON F.rfds_processing_id = C.rfds_processing_id
  WHERE 
      F.rfds_processing_id = C.rfds_processing_id 
      AND F.sector = C.sector 
      AND F.type = C.type
      AND F.position = C.position   
  RETURN
END

enter image description here

1 Ответ

0 голосов
/ 01 июля 2019

Следующий запрос должен делать то, что вы хотите:

ALTER PROCEDURE [dbo].[CalculateProposedAntennas]
(
  @rfds_processing_id uniqueidentifier = null,
  @id uniqueidentifier OUTPUT
)
AS
BEGIN
  SET NOCOUNT ON

UPDATE P 
SET P.qty = F.qty - C.qty 
   ,P.model = CASE WHEN Proposed.qty > 0 THEN F.model ELSE NULL END
FROM Proposed_Antenna P
INNER JOIN Final_Antenna F
      ON F.rfds_processing_id = P.rfds_processing_id AND F.sector = P.sector AND F.type = P.type AND F.position = P.position
INNER JOIN Current_Antenna C
      ON C.rfds_processing_id = P.rfds_processing_id AND C.sector = P.sector AND C.type = P.type AND C.position = P.position
  RETURN
END

Я настоятельно рекомендую вам создать столбец [UID] во всех трех ваших таблицах - регистр уникального идентификатора можно сгенерировать, как показано ниже, сгенерированный ключ имеет тип varbinary, что намного лучше, чем сравнение строк в соединениях

select [UID] = HashBytes('MD5',rfds_processing_id+type+sector+position)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...