【问题标题】:Update a table by using multiple joins使用多个连接更新表
【发布时间】: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


    【解决方案1】:

    如果我是你,我会:

    1) 关闭自动提交(如果您还没有)

    2) 制作一个选择/联接,它返回一组列,这些列标识您要更新的记录,例如select c1, c2, ... from A join B join C... WHERE ...

    3) 发布更新。例如。更新 salesrep SET CX = cx 其中 C1 = c1 AND C2 = c2 AND... (在 C1、C2、... 上建立索引将提高性能)

    4) 提交。

    这样您就不必担心将更新和联接混合在一起,并且在 txn 中执行此操作可确保在您的更新通过之前没有任何东西可以改变联接的结果。

    【讨论】:

      猜你喜欢
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-03
      • 2015-05-28
      • 1970-01-01
      相关资源
      最近更新 更多