我正在使用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列。
我需要做些什麼才能使此多連接更新查詢生效?或者這是不可能的這個數據庫?
任何意見表示讚賞。