【发布时间】:2014-12-02 11:20:17
【问题描述】:
我正在使用 Java DB(Java DB 是 Oracle 支持的 Apache Derby 版本,包含与 Apache Derby 相同的二进制文件。来源:http://www.oracle.com/technetwork/java/javadb/overview/faqs-jsp-156714.html#1q2)。
我正在尝试更新一个表中的列,但是我需要将该表与同一数据库中的其他 2 个表连接起来以获得准确的结果(不是我的设计,也不是我的选择)。
下面是我的三个表,ADSID 是链接 Vehicles 和 Customers 的关键,Salesresp 中的 ADDRESS 和 ZIP 用于将其链接到 Customers。 (为简洁起见,省略了其他字段。)
Salesresp(地址、邮编、预售)
客户(adsid、地址、邮政编码)
车辆(adsid,selldate)
目标是在 SalesResp 表中找到在给定日期之前购买过车辆的客户。它们分别由 Customer 和 Vechiles 中的 address 和 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 列遇到“内部”。
我需要做什么才能让这个多连接更新查询起作用?或者这个数据库根本不可能?
感谢任何建议。
【问题讨论】:
标签: sql-update inner-join multiple-tables javadb