Обновить объединяемые таблицы с максимальной датой sql - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь обновить V.PUR_UNIT из PO_VEND_ITEM, чтобы он равнялся значению R.RECVD_UNIT из PO_RECVR_HIST_LIN, но я хочу выбрать 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 голосов
/ 06 декабря 2018

Если ваш SQL дает таблицу и псевдоним, вам нужно использовать псевдоним, а не имя таблицы везде, поэтому обновление должно быть UPDATE V, а не UPDATE PO_VEND_ITEM.

В любом случае, это все ещене решит вашу проблемуВы не можете обновить агрегированный запрос - суть агрегации состоит в том, что он группирует строки, и поэтому больше не связывает исходные строки - он не знает, какие строки нужно обновить.

ОБНОВЛЕНО НИЖЕ, УДАЛЕНО НЕПРАВИЛЬНЫЕ ДАННЫЕ.

Если вы хотите отсортировать по одному столбцу, но использовать другой столбец, агрегаты обычно не будут работать.Вместо этого в подзапросе сортируйте данные, которые вам нужно использовать, присваивая им номер строки, а затем присоединяйте только к строке 1 - той строке, в которой находятся нужные вам данные.Это обновит только строки PO_VEND_ITEM, в которых есть любые соответствующие строки PO_RECVR_HIST_LIN - если вы хотите обновить их все, то измените внутреннее соединение на левое внешнее соединение, и для любых без соответствующих строк будет установлено значение 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;
...