sql - ¿Actualizar una tabla con unión?

CorePress2024-01-25  10

Estoy intentando actualizar la tabla A con datos de la tabla B. Pensé que podía hacer algo como esto

update A 
set A.DISCOUNT = 3 
from INVOICE_ITEMS A
join ITEM_PRICE_QUNTITY B on A.ITEM_PRICE_NO = B.ID
where A.INVOICE_ID = 33

pero aparece el error Mensaje SQL: -104 Token no válido

¿Alguien puede ayudarme?

solo usa el delimitador ';' al final del Comunicado

- mohan111

17/07/2014 a las 10:01

intenta eliminar A en A.DISCOUNT

- Jay Kazama

17/07/2014 a las 10:01

Nota: He eliminado la etiqueta sql-server: su pregunta no es sobre SQL Server (un producto de Microsoft), sino sobre Firebird. Agregue solo etiquetas relevantes a su pregunta

-Mark Rotteveel

17/07/2014 a las 10:38



------------------------------------

No es posible hacer esto con JOIN. La declaración UPDATE de Firebird no tiene cláusula FROM. La sintaxis es:

UPDATE {tablename | viewname} [[AS] alias]
   SET col = newval [, col = newval ...]
   [WHERE {search-conditions | CURRENT OF cursorname}]
   [PLAN plan_items]
   [ORDER BY sort_items]
   [ROWS <m> [TO <n>]]
   [RETURNING <values>]

<m>, <n>     ::=  Any expression evaluating to an integer.
<values>     ::=  value_expression [, value_expression ...]
<variables>  ::=  :varname [, :varname ...]

Sin embargoel equivalente de su consulta de ejemplo es:

update INVOICE_ITEMS 
set DISCOUNT = 3 
WHERE EXISTS (SELECT 1 FROM ITEM_PRICE_QUNTITY B WHERE B.ID = ITEM_PRICE_NO)
AND INVOICE_ID = 33

Si desea actualizar utilizando datos de tablas adicionales, puede considerar utilizar MERGE. En tu comentario solicitas la consulta equivalente para hacer lo siguiente con Firebird:

UPDATE B 
SET B.QUANTIY = b.QUANTIY + a.QUANTITY 
FROM ITEM_PRICE_QUNTITY B JOIN INVOICE_ITEMS A ON A.ITEM_PRICE_NO = B.ID 
WHERE A.INVOICE_ID = 33

La declaración MERGE equivalente sería:

MERGE INTO ITEM_PRICE_QUNTITY AS B
    USING INVOICE_ITEMS AS A
    ON A.ITEM_PRICE_NO = B.ID AND A.INVOICE_ID = 33
    WHEN MATCHED THEN
        UPDATE SET B.QUANTIY = B.QUANTIY + A.QUANTITY 

1

1

¿puedo obtener Firebird SQL para esta consulta? (versión inversa de la consulta anterior) ACTUALIZAR B SET B.QUANTIY = b.QUANTIY + a.QUANTITY FROM ITEM_PRICE_QUNTITY B JOIN INVOICE_ITEMS A ON A.ITEM_PRICE_NO = B.ID DONDE A.ID_FACTURA = 33

-Azad

17/07/2014 a las 16:05



------------------------------------

Del manual de FB, si estás usando Firebird 2.0 o superior, puedes usar EXECUTE BLOCK para escribir una declaración más efectiva:

EXECUTE BLOCK
AS
DECLARE VARIABLE field1 type;
DECLARE VARIABLE field2 type;
-- ...etc.
DECLARE VARIABLE pk type;
BEGIN
   for select pk, field1, field2, ... from src_table
   into :pk, :field1, :field2, ...
   do update dest_table set field1 = :field1, field2 = :field2, -- ...
   where pk = :pk;
END
Respondido al

9 de agosto de 2019 a las 15:20

Robles

Robles

51

1

1 insignia plateada

5

5 hermanoinsignias nze

1

Esta también podría ser una solución, no pude probar tu respuesta con mi problema ya que la pregunta se publicó hace cinco años.

-Azad

15/08/2019 a las 6:36

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare