更新具有最大日期sql的联接表

时间:2018-12-05 05:06:48

标签: sql-server-2008 join sql-update having-clause

我正在尝试将PO_VEND_ITEM中的V.PUR_UNIT更新为等于PO_RECVR_HIST_LIN中的R.RECVD_UNIT的值,但我想选择R.RECVD_UNIT作为最后一次收到的日期 我已经在下面创建了脚本,但是仍然出现错误

Update
PO_VEND_ITEM
Set
V.PUR_UNIT = R.RECVD_UNIT
FROM
PO_RECVR_HIST_LIN R

INNER JOIN
PO_VEND_ITEM V

ON
V.ITEM_NO = R.ITEM_NO

GROUP BY
V.PUR_UNIT,
V.ITEM_NO


HAVING
R.RECVR_DAT = MAX(R.RECVR_DAT) 

任何建议请

1 个答案:

答案 0 :(得分:0)

如果您的SQL提供了表和别名,则需要使用别名,而不是其他任何地方的表名,因此更新应该是UPDATE V,而不是UPDATE PO_VEND_ITEM。

无论如何,那仍然无法解决您的问题。您无法更新汇总查询-汇总的全部目的是将行分组在一起,因此不再链接原始行-它不知道要更新哪些行。

更新如下,删除了不正确的数据。

如果要按一列排序,但要使用另一列,则聚合通常不会起作用。相反,在子查询中,通过给其一个行号对需要使用的数据进行排序,然后仅连接到行1-即具有所需数据的行。这只会更新有匹配PO_RECVR_HIST_LIN行的PO_VEND_ITEM行-如果要更新所有行,则将内部联接更改为左外部联接,而没有匹配行的任何联接都将设置为NULL。

UPDATE V SET PUR_UNIT = R.QTY_UNIT
FROM PO_VEND_ITEM V
    INNER JOIN (
        SELECT ITEM_NO, QTY_UNIT, ROW_NUMBER() OVER (PARTION BY ITEM_NO ORDER BY RECVR_DAT DESC) RowNo
        FROM PO_RECVR_HIST_LIN
        ) R ON R.ITEM_NO = V.ITEM_NO AND R.RowNo = 1;