SQL UPDATE строк из связанных записей TOP 1 - PullRequest
0 голосов
/ 06 мая 2020

У меня есть таблица Products с 2 столбцами: ProductID, ProductName.

Когда я продаю эти продукты, я сохраняю продажи в 2 таблицах:

  • SalesHeaders с 3 столбцами: IDHeader, EmployeeName, Date
  • SalesRows с 3 columns: IDHeader, IDRow, ProductID

Есть 2 сотрудника, Джон и Мэри.

Теперь мне нужно добавить новый столбец в мою таблицу Products под названием LastMarySaleDate. Итак, я хочу обновить Products.LastMarySaleDate, и для этого мне нужно выбрать самую последнюю запись из SalesHeaders, где EmployeeName = 'mary' и SalesRows.ProductID = Products.ProductID.

Вот пример данных с ожидаемыми результатами

Продукты (до ОБНОВЛЕНИЯ):

ProductID  ProductName  LastMarySaleDate
--------- ------------  ----------------
A01        Mouse
A02        Keyboard
A03        Speakers

Заголовки продаж:

IDHeader  EmployeeName  Date
--------  ------------  ----------
1         Mary          2020-05-01
2         Mary          2020-05-02
3         John          2020-05-03

Строки продаж:

IDHeader  IDRow  ProductID
--------  -----  ---------
1         1      A01
1         2      A02
2         3      A01
3         4      A02
3         5      A03

Продукты (после ОБНОВЛЕНИЯ):

ProductID  ProductName  LastMarySaleDate
--------- ------------  ----------------
A01        Mouse        2020-05-02
A02        Keyboard     2020-05-01
A03        Speakers     Note: Empty, since Mary never sold this productID

Я пробовал

UPDATE Products
SET Products.LastMarySaleDate = H.Date
FROM 
    (SELECT TOP 1 *
     FROM SalesHeaders 
     LEFT OUTER JOIN SalesRows ON SalesHeaders.IDHeader = SalesRows.IDHeader
     WHERE SalesHeaders.EmployeeName = 'Mary' 
       AND SalesRows.ProductID = Products.ProductID
     ORDER BY SalesHeaders.Date DESC) AS H

, но не могу понять. Если бы кто-нибудь мог мне с этим помочь, было бы здорово, спасибо!

1 Ответ

0 голосов
/ 06 мая 2020

Думаю, это то, что вы ищете:

CREATE TABLE #Product (ProductID varchar(10),   ProductName varchar(20),  LastMarySaleDate DATE)
INSERT INTO #Product
    VALUES ('A01','Mouse', NULL),
    ('A02','Keyboard',NULL),
    ('A03','Speakers',NULL)


CREATE TABLE #SalesHeader(IDHeader INT,  EmployeeName varchar(20), DT  Date)
INSERT INTO #SalesHeader VALUES (1,'Mary','2020-05-01'),
                                (2,'Mary','2020-05-02'),
                                (3,'John','2020-05-03')


CREATE TABLE #SalesRows(IDHeader int,  IDRow int,  ProductID varchar(10))
INSERT INTO #SalesRows VALUES(1,1,'A01'),
                            (1,2,'A02'),
                            (2,3,'A01'),
                            (3,4,'A02'),
                            (3,5,'A03')



UPDATE #Product
    SET LastMarySaleDate = t2.DT
FROM #Product t1
INNER JOIN 
    (
        SELECT ProductID, MAX(dt) DT 
        FROM #SalesHeader t1
        INNER JOIN #SalesRows t2 on t1.IDHeader = t2.IDHeader
        WHERE t1.EmployeeName = 'Mary'
        GROUP BY ProductID
    ) t2 on t1.ProductID = t2.ProductID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...