【问题标题】:Update join tables having max date sql更新具有最大日期 sql 的连接表
【发布时间】:2018-12-05 05:06:48
【问题描述】:

我正在尝试将 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) 

请多多指教

【问题讨论】:

  • 请在此问题上提供任何帮助

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


【解决方案1】:

如果你的 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;

【讨论】:

  • 谢谢,但它看起来不起作用。我想要 PUT_UNIT = QTY_UNIT,其中 RECVR_DAT = MAX(RECVR_DAT)。我已将代码更改为以下但仍无法正常工作 UPDATE V SET PUR_UNIT = R.QTY_UNIT FROM PO_VEND_ITEM V INNER JOIN ( SELECT ITEM_NO, QTY_UNIT, MAX(RECVR_DAT) AS MAXDATE FROM PO_RECVR_HIST_LIN WHERE ITEM_NO = '300011' GROUP BY ITEM_NO, QTY_UNIT ) R ON R.ITEM_NO = V.ITEM_NO;
  • 对不起,我误读了您的问题。我想这就是你需要的。
  • 没问题 DancingFool 谢谢你的大力帮助
猜你喜欢
  • 2016-02-23
  • 2020-01-04
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
  • 2016-03-18
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多