2014-10-07 76 views
0

我正在使用Java DB(Java DB是Oracle支持的Apache Derby版本,並且包含與Apache Derby相同的二進制文件,源:http://www.oracle.com/technetwork/java/javadb/overview/faqs-jsp-156714.html#1q2)。我想要更新一個表中的列,但是我需要與同一個數據庫中的2個其他表一起加入該表,以獲得準確的結果(不是我的設計,也不是我的選擇)。使用多個連接更新表

下面是我的三張表,ADSID是一個鏈接車輛和客戶的關鍵字,Salesresp中的ADDRESS和ZIP用於將其鏈接到客戶。 (其他領域留下了爲簡潔起見。)

Salesresp(地址,郵編,prevsale)

客戶(adsid,地址,郵編)

車輛(adsid,selldate)

目標是找到SalesResp表中的客戶,該客戶以前在給定日期之前購買了一輛車。它們分別由Customers和Vechiles中的地址和adsid標識。

我已經看到更新了單列連接的列,實際上問了一個關於我自己更新/連接的問題(UPDATE with INNER JOIN)。但現在我需要更進一步,並使用這兩個表來獲取所有信息。

我可以得到一個多JOIN SELECT語句的工作:

SELECT * FROM salesresp 
INNER JOIN customers ON (SALESRESP.ZIP = customers.ZIPCODE) AND 
(SALESRESP.ADDRESS = customers.ADDRESS) 
INNER JOIN vehicles ON (Vehicles.ADSId =Customers.ADSId) 
WHERE (VEHICLES.SELLDATE<'2013-09-24'); 

但是我不能讓多JOIN UPDATE語句工作。

我試圖嘗試這樣的更新:

UPDATE salesresp SET PREVSALE = (SELECT SALESRESP.address FROM SALESRESP 
WHERE SALESRESP.address IN (SELECT customers.address FROM customers 
WHERE customers.adsid IN (SELECT vehicles.adsid FROM vehicles 
WHERE vehicles.SELLDATE < '2013-09-24'))); 

而且我給出的這個錯誤:「錯誤代碼30000,SQL狀態21000:標量子查詢只允許返回一行」。

但是,如果我將第一個「=」更改爲「IN」,它會遇到「IN」(錯誤代碼30000,SQL狀態42X01)時出現語法錯誤。

我也試圖做更明目張膽的內部連接,但試圖執行此代碼時,我得到了與上面相同的錯誤:「錯誤代碼30000,SQL狀態42X01」,它抱怨我使用「FROM」關鍵詞。

update salesresp set prevsale = vehicles.selldate 
from salesresp sr 
inner join vehicles v 
on sr.prevsale = v.selldate 
inner join customers c 
on v.adsid = c.adsid 
where v.selldate < '2013-09-24'; 

並在不同的配置:

update salesresp 
inner join customer on salesresp.address = customer.address 
inner join vehicles on customer.adsid = vehicles.ADSID 
set salesresp.SELLDATE = vehicles.selldate where vehicles.selldate < '2013-09-24'; 

在哪裏找到的 「內」 難吃:錯誤代碼30000,SQL狀態42X01:語法錯誤:在第3行中遇到 「內」,第1列。

我需要做些什麼才能使此多連接更新查詢生效?或者這是不可能的這個數據庫?

任何意見表示讚賞。

回答

0

如果我是你,我會:

1)關閉自動提交(如果你還沒有的話)

2)工藝選擇/連接返回一組列的標識你的記錄想要更新Eg選擇c1,c2,... from A join B join C ... WHERE ...

3)發佈更新。例如。更新salesrep SET CX = cx其中C1 = c1 AND C2 = c2 AND ... (具有C1,C2 ...上的索引將提升性能)

4)Commit。

通過這種方式,您不必擔心混合更新和連接,並在txn內執行此操作,以確保在更新通過之前,無法更改連接的結果。