2014-10-07 111 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内执行此操作,以确保在更新通过之前,无法更改连接的结果。