我需要用同一表中的另一个值更新表中的一个值。我试着用LEFT JOIN:
UPDATE
acc_sem_unt.t_Unterlag
SET
Verkettungsartikel = ISNULL(unt2.Unt_ID, Verkettungsartikel)
FROM
acc_sem_unt.t_Unterlag
LEFT JOIN
(
SELECT unt2.Unt_ID, Unt_Prod_ID FROM acc_sem_unt.t_Unterlag unt2
WHERE Unt_ID IS NOT NULL
) unt2 ON Verkettungsartikel = unt2.Unt_Prod_ID
WHERE Verkettungsartikel IS NOT NULL
正如您所看到的,我在Unt_Prod_ID值的LEFT join中加入了同一个表。但是,表中的多行可以具有相同的Unt_Prod_ID值,我只需要在LEFT JOIN中获得最上面的一行。
当LEFT JOIN返回一行时,此查询有效,但在某些情况下它可以返回多行。
我尝试使用OUTER APPLY:
UPDATE
acc_sem_unt.t_Unterlag
SET
Verkettungsartikel = ISNULL(unt2.Unt_ID, Verkettungsartikel)
FROM
acc_sem_unt.t_Unterlag
OUTER APPLY
(
SELECT TOP 1 unt2.Unt_ID, Unt_Prod_ID FROM acc_sem_unt.t_Unterlag unt2
WHERE Unt_ID IS NOT NULL
AND Verkettungsartikel = unt2.Unt_Prod_ID
) unt2
WHERE Verkettungsartikel IS NOT NULL
但它并没有改变价值——旧的价值仍然存在。
当t_Unterlag表中的多行具有相同的Unt_Prod_ID值时,我如何修改此查询,以便仅获得顶部值?
使用CROSS APPLY和别名(unt1,unt2…(
UPDATE unt1
SET unt1.Verkettungsartikel = unt2.Unt_ID
FROM acc_sem_unt.t_Unterlag unt1
CROSS
APPLY
( SELECT TOP 1
unt2.Unt_ID
FROM acc_sem_unt.t_Unterlag unt2
WHERE unt2.Unt_ID is not null
and unt2.Unt_Prod_ID = unt1.Verkettungsartikel
) unt2
WHERE unt1.Verkettungsartikel is not null