Обновление таблицы SQL Server Row by row из значений другой таблицы с объединениями - PullRequest
0 голосов
/ 13 сентября 2018

у меня 3 таблицы.

Table Product

Product_ID | Review_date |
1          | 01/01/2018    |
2          | 01/01/2018    |
3          | 01/01/2018    |
4          | 01/01/2018    |

Table Inventory
Inventory_ID  | Product_ID  | Location_ID
1             |        2    | 1    |
2             |        2    | 3    |
3             |        3    | 4    |
4             |        1    | 4    |

Table Location
Location_ID| Review_date |
1          | 04/02/2018    |
2          | 06/03/2018    |
3          | 01/05/2018    |
4          | 08/28/2018    |

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

Я хочу обновить дату проверки в таблице продуктов для каждого идентификатора продукта и выбрать максимальное значение (review_date) из таблицы местоположений для каждого идентификатора продукта. Потому что продукт может иметь несколько запасов и назначенных ему мест. Я хочу, чтобы дата обновления местоположения продукта была обновлена.

Ожидаемый результат

Таблица продукции

Product_ID | Review_date |
1          | 08/28/2018    |  this prod id in inventory has loc id 4. 
2          | 04/02/2018    |  two inv records for the product so max date
3          | 08/28/2018    |
4          | 01/01/2018    |  no inv record. so leave it as such


UPDATE  P
SET     P.review_date = L.Inventory_review_date
FROM    Product AS P
CROSS APPLY
        (
        select  top 1 inventory_review_Date
        from    Location as L, Inventory as I, PRODUCT as P
        where   L.Location_ID = I.Inventory_ID and P.Product_ID = I.Product_ID
        order by
                L.Inventory_Review_date desc
        ) as L  

Я пробовал что-то подобное по-разному, но, похоже, я этого не понимаю. Любая помощь приветствуется. ТИА

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Если вы посмотрите на это таким образом. У вас есть таблица продуктов и комбинация инвентаря и местоположения. Вы можете сделать это с помощью подзапроса или попытаться выяснить это с помощью общего табличного выражения MS CTE DOCS

Это будет выглядеть примерно так:

  • Определите дату последней проверки для любого продукта в инвентаре.
  • Обновить эти продукты в Product

Используя CTE, это было бы что-то вроде.

WITH inv_loc_cte AS
(
Select i.Product_id, max(l.Review_date)
    from Inventory i 
    inner join [Location] l on i.Location_id = i.Location_id
    Group by i.Product_id
)
UPDATE p
SET Review_date = c.Review_date
FROM Product p
INNER JOIN inv_loc_cte c on p.Product_id = c.Product_id
0 голосов
/ 13 сентября 2018

Во-первых, никогда используйте запятые в предложении FROM. Всегда используйте правильный, явный, стандартный JOIN синтаксис.

Во-вторых, вы можете сделать это с APPLY. Проблема заключается в повторении таблицы Product. Вам нужно условие корреляции , чтобы это работало так, как вы ожидаете. Но нет никакой корреляции между подзапросом и обновляемой таблицей, поэтому все получают одно и то же значение.

Итак:

UPDATE P
    SET review_date = L.Inventory_review_date
    FROM Product P CROSS APPLY
         (SELECT TOP (1) L.inventory_review_Date
          FROM Location L JOIN
               Inventory I
               ON L.Location_ID = I.Inventory_ID 
          WHERE P.Product_ID = I.Product_ID
          ORDER BY L.Inventory_Review_date DESC
        ) L;

Вы также можете сделать это, используя GROUP BY. Существует большая вероятность, что при правильных индексах APPLY будет быстрее.

0 голосов
/ 13 сентября 2018

Похоже, вы соединяете таблицу местоположений с таблицей инвентаря в двух разных частях информации. (идентификатор местоположения и идентификатор продукта) Если LocationID в таблице инвентаризации является идентификатором местоположения, а не датой (как в вашем примере), попробуйте это. (Не проверено)

UPDATE  P
SET     P.review_date = L.Inventory_review_date
FROM    Product AS P
CROSS APPLY
        (
        select  top 1 inventory_review_Date
        from    Location as L, Inventory as I, PRODUCT as P
        where   L.Location_ID = I.Location_ID and P.Product_ID = I.Product_ID
        order by
                L.Inventory_Review_date desc
        ) as L  

Кроме того, я бы подумал, что вам нужно будет заказать по Location_ID, чтобы собрать все местоположения вместе, а затем выбрать верхнюю дату. Я не пробовал, поэтому агрегатная функция TOP может не позволить вам сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...