2014-07-17 97 views
3

我想更新從表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 

,但得到的錯誤 SQL消息:-104 無效令牌

誰能幫助我?

+0

只是用分隔符「;」在聲明 – mohan111

+0

結束時嘗試刪除'A.DISCOUNT'中的'A' –

+0

注意:我已經刪除了_sql-server_標記:您的問題不是關於SQL Server(Microsoft產品),而是關於Firebird。請只添加相關標籤到您的問題 –

回答

4

這是不可能用JOIN做到這一點。火鳥UPDATE聲明沒有FROM條款。該syntax是:

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 ...] 

但是你的例子查詢相對應的是:

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 

如果你想利用附加的表中的數據進行更新,你可能要考慮使用MERGE。在你的評論索要相當於查詢做火鳥如下:

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 

等效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 
+0

非常感謝你,先生,我改變A.INVOICE_ID = 33到INVOICE_ID = 33,它工作 – azad

+0

@Azzi啊,我錯過了那一個;更新了我的答案。 –

+1

可以我得到火鳥SQL此查詢?(反向上述查詢的版本)UPDATE乙 SET B.QUANTIY = b.QUANTIY + a.QUANTITY FROM ITEM_PRICE_QUNTITY乙 JOIN INVOICE_ITEMS A ON A.ITEM_PRICE_NO = B.ID WHERE A.INVOICE_ID = 33 – azad

0

你可以使用這樣的:

update INVOICE_ITEMS 
set DISCOUNT = 3 
from (select * from ITEM_PRICE_QUNTITY) b 
where INVOICE_ITEMS.ITEM_PRICE_NO = B.ID and 
INVOICE_ITEMS.INVOICE_ID = 33 
+0

不,它不起作用 – azad

+0

它一定是工作。 看看fidlle:[小提琴](http://sqlfiddle.com/#!6/22b02/2) 你能分享你的表箱箱腳本嗎? –

+0

@ErsinTarhan問題是關於Firebird的這種語法無效的問題,這個問題最初是用_sql-server_標記的。 –