aza*_*zad 4 sql firebird firebird2.5
我试图用表B中的数据更新表A.我想我可以做这样的事情
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
Run Code Online (Sandbox Code Playgroud)
但收到错误SQL消息:-104无效的令牌
谁能帮我?
这是不可能的JOIN.Firebird UPDATE声明没有任何FROM条款.该语法是:
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 ...]
Run Code Online (Sandbox Code Playgroud)
但是,您的示例查询的等价物是:
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
Run Code Online (Sandbox Code Playgroud)
如果要使用其他表中的数据进行更新,可能需要考虑使用MERGE.在您的评论中,您要求使用等效查询与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
Run Code Online (Sandbox Code Playgroud)
等同的MERGE陈述是:
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
Run Code Online (Sandbox Code Playgroud)
小智 5
从FB手册来看,如果您使用的是Firebird 2.0或以上版本,您可以使用EXECUTE BLOCK编写更有效的语句:
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
Run Code Online (Sandbox Code Playgroud)