SQL Server - Обновлять столбцы с помощью CASE на основе внутреннего объединения, когда в таблице, к которой я присоединяюсь, гораздо больше строк, чем в обновляемой таблице - PullRequest
0 голосов
/ 23 октября 2018

Я работаю над тем, как обновить статус заказа в моей системе на основе статуса заголовков счетов-фактур заказа.В настоящее время запрос ниже делает это, однако это делает это многократно (один раз на заголовок счета).Все заголовки счетов в заказе будут иметь одинаковый статус, поэтому я ищу способ ограничить это проверкой только одного заголовка счета.

UPDATE [MyServer].[MyDatabase].[dbo].[Orders]
SET Status = (
        CASE 
            WHEN ih.InvoiceStatus = 'ReadyToPrint'
                THEN 4
            WHEN ih.InvoiceStatus = 'Transferred'
                THEN 5
            END
        )
FROM [MyServer].[MyDatabase].[dbo].[Orders] ord
INNER JOIN Database2.dbo.invoiceheader ih
    ON ih.OrderHeaderNumber= ord.OrderNumber
WHERE ord.Status = 2

SAMPLE DATA: в настоящее время, если я сделаю SELECTв статусе, а не в наборе, я получаю 4 или 5 для каждого заголовка счета.Я хотел бы найти способ ограничить это только одним на заказ.

Заголовки счетов-фактур имеют отношение к заказам на основе OrderHeaderNumber заголовка счета-фактуры и OrderNumber заказа, с чем я сопоставляюсь дляthe Inner Join.

SAMPLE Строки заголовков счетов: Ниже приведены два примера заголовков счетов для гипотетического заказа.

OrderHeaderNumber - InvoiceNumber - HeaderCharge - InvoiceStatus
12345             - 129           - 200          - ReadyToPrint
12345             - 128           - 350          - ReadyToPrint

1 Ответ

0 голосов
/ 23 октября 2018

Вы можете использовать различные стили, чтобы получить одно значение.Я предпочитаю этот метод, так как вы можете выбрать и получить точный список того, что будет обновлено.

UPDATE ord SET Status = ih.InvoiceStatus
--SELECT *
FROM [MyServer].[MyDatabase].[dbo].[Orders] ord
INNER JOIN (
    SELECT DISTINCT
        OrderHeaderNumber
        ,CASE 
            WHEN ih.InvoiceStatus = 'ReadyToPrint'
                THEN 4
            WHEN ih.InvoiceStatus = 'Transferred'
                THEN 5
         END AS InvoiceStatus
    FROM Database2.dbo.invoiceheader
) ih ON ih.OrderHeaderNumber= ord.OrderNumber
WHERE ord.Status = 2
...