SQL Update запрос - PullRequest
       4

SQL Update запрос

0 голосов
/ 28 июня 2009

Этот SQL-запрос не выполняется. Может кто-нибудь дать правильный синтаксис?

UPDATE PayrollTotals ptm 
  SET PTAmount = PTAmount + 
    (SELECT pts.PTAmount FROM PayrollTotals pts WHERE pts.PTACID = 38 
       AND pts.PTAmount > 0 
       AND pts.PTEmpID= ptm.PTEmpID)
WHERE PTACID = 42 

Я хочу обновить типы 42 с типами 38, где PTEmpID совпадают. Также сумма PTAmount.

Редактировать: Всегда будет 38 и 42 строки для каждого PTEmpID. Поэтому я просто хочу добавить 38 к 42, где PTEmpID соответствует. Вся таблица, которая есть.

1 Ответ

3 голосов
/ 28 июня 2009

Три проблемы с этим запросом:

  • Если нет результатов для коррелированного подзапроса, он возвращает NULL, который нельзя добавить в PTAmount.
  • Если естьнесколько результатов для подзапроса, он также не сможет добавить, так как из подзапроса в скобках может быть возвращено только одно значение.
  • Нельзя псевдоним таблицу UPDATE рядом с UPDATE.ключевое слово.Вам нужно предложение FROM после SET, чтобы дать ему псевдоним "ptm".

Попробуйте вместо этого:

UPDATE PayrollTotals SET PTAmount = PTAmount + 
  (SELECT SUM(pts.PTAmount) FROM PayrollTotals pts WHERE 
    pts.PTACID = 38 
    AND pts.PTAmount > 0
    AND pts.PTEmpID = ptm.PTEmpID)
FROM
    PayrollTotals AS ptm
WHERE
    PTACID = 42

SUM () гарантирует, что вы получитепо крайней мере, 0 результат из подзапроса, и если есть несколько результатов, он суммирует их, прежде чем добавить их в ptm.PTAmount.

Кроме того, вам не нужен псевдоним таблицы.Так как PayrollTotals подзапроса имеет псевдонимы pts, вы можете обратиться к обновленной таблице напрямую по ее имени:

UPDATE PayrollTotals SET PTAmount = PTAmount + 
  (SELECT SUM(pts.PTAmount) FROM PayrollTotals pts WHERE 
    pts.PTACID = 38 
    AND pts.PTAmount > 0
    AND pts.PTEmpID = PayrollTotals.PTEmpID)
WHERE
    PTACID = 42
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...