当LEFT JOIN可以返回多行时,用同一表中的值更新行

  • 本文关键字:更新 JOIN LEFT 返回 sql-server
  • 更新时间 :
  • 英文 :


我需要用同一表中的另一个值更新表中的一个值。我试着用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

最新更新