SQL Сервер - код для обновления значений с помощью внутреннего запроса self join - PullRequest
0 голосов
/ 30 января 2020

для большинства это может быть просто c, но я бы хотел получить помощь.

Использование SQL сервера У меня есть следующая таблица заказов (отрывок Excel для упрощения):

Simplified Excel Excerpt

Обратите внимание, что существует несколько заказов (OrderID). Некоторые могут иметь значение «PrimaryOrder», что означает, что они связаны с существующим предыдущим заказом. Связанные заказы получают "PrimaryOrder" 1-го связанного заказа и "OrderIndex", отмечая заказ, в котором они пришли. Только первый заказ в каждом наборе имеет значение. Если «PrimaryOrder» для ордера имеет значение NULL, это означает, что это один ордер, и я должен просто проигнорировать его.

Что мне нужно, с помощью команды SQL Server Update все одинаковые ордера выдаются одинаково «стоимость» как их «стоимость» 1-го порядка. То есть для каждого ордера с «OrderIndex»> 1 обновите его поле «Значение» с NULL до значения «PrimaryOrder». Если "PrimaryOrder" = 1 ИЛИ НЕДЕЙСТВИТЕЛЕН, игнорируйте и не обновляйте.

Desired Outcome

Попробовал несколько простых INNER JOIN, но потерян. Я не думаю, что это должно быть слишком сложно, но я, возможно, слишком обдумал это.

Спасибо!

Ответы [ 4 ]

0 голосов
/ 30 января 2020

Спасибо всем. Удалось взять что-то из всего вышеперечисленного и это решило:

UPDATE O
    SET O.[Value] = B.[Value]
FROM Orders O INNER JOIN Orders B
ON O.PrimaryOrder = B.[PrimaryOrder] and O.OrderIndex > 1 and O.[Value] is NULL
AND B.[OrderIndex] = 1
0 голосов
/ 30 января 2020

Возможно что-то вроде этого:

UPDATE #table
SET a.Value=b.Value
FROM #table a INNER JOIN #table b 
        on a.OrderID=b.PrimaryOrder and a.OrderIndex>1 and a.Value is NULL
0 голосов
/ 30 января 2020
UPDATE o
SET Value=MaxVals.MaxValue
FROM Orders o
INNER JOIN (
    SELECT MAX(Value) AS MaxValue, PrimaryOrder
    FROM Orders
    WHERE PrimaryOrder IS NOT NULL
    GROUP BY PrimaryOrder
) AS MaxVals ON MaxVals.PrimaryOrder=o.PrimaryOrder
WHERE o.Value IS NULL
0 голосов
/ 30 января 2020

Вы можете использовать коррелированный подзапрос с update оператором:

update o
     set o.value = (select top (1) o1.value
                    from Orders o1 
                    where o1.primaryorder = o.primaryorder and 
                          o1.value is not null and
                          o1.orderindex <= o.orderindex
                    order by o1.orderindex desc
                   )
from Orders o
where o.value is null;
...