我正在使用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列。
我需要做些什么才能使此多连接更新查询生效?或者这是不可能的这个数据库?
任何意见表示赞赏。