我正在使用Java DB(Java DB是Oracle支持的Apache Derby版本,包含与Apache Derby相同的二进制文件。来源:http://www.oracle.com/technetwork/java/javadb/overview/faqs-jsp-156714.html#1q2)。
我正在尝试更新一个表中的列,但是我需要将该表与同一数据库中的另外两个表连接起来以获得准确的结果(不是我的设计,也不是我的选择)。
以下是我的三个表格,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')));
我收到此错误:&#34;错误代码30000,SQL状态21000:标量子查询只允许返回单行&#34;。
但如果我先改变那个&#34; =&#34;到&#34; IN&#34;它给我一个语法错误,遇到了&#34; IN&#34; (错误代码30000,SQL状态42X01)。
我还试图做更明显的内部联接,但在尝试执行此代码时,我得到了与上面相同的错误:&#34;错误代码30000,SQL状态42X01&#34;抱怨我使用&#34; FROM&#34;关键字。
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';
它找到&#34; INNER&#34;令人反感:错误代码30000,SQL状态42X01:语法错误:遇到&#34;内部&#34;在第3栏第1栏。
要使此多联接更新查询生效,我需要做什么?或者这个数据库根本不可能?
感谢任何建议。
答案 0 :(得分:0)
如果我是你,我会:
1)关闭自动提交(如果你还没有)
2)制作一个select / join,它返回一组标识你想要更新的记录的列。选择c1,c2,...从A加入B加入C ... WHERE ...
3)发布更新。例如。更新salesrep SET CX = cx其中C1 = c1 AND C2 = c2 AND ... (在C1,C2上有一个索引,......会提高性能)
4)提交。
这样您就不必担心混合更新和联接,并且在txn中执行此操作可确保在更新完成之前没有任何内容可以更改联接的结果。