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