2014-10-07 4 views
0

Я использую Java DB (Java DB - поддерживаемая версия Oracle Apache Derby и содержит те же двоичные файлы, что и Apache Derby.): http://www.oracle.com/technetwork/java/javadb/overview/faqs-jsp-156714.html#1q2).Обновление таблицы с помощью нескольких соединений

Я пытаюсь обновить столбец в одной таблице, однако мне нужно присоединиться к этой таблице с двумя другими таблицами в одной базе данных, чтобы получить точные результаты (не мой дизайн и мой выбор).

Ниже приведены мои три таблицы. ADSID - это ключевое связывание Транспортных средств и Клиентов, а ADDRESS и ZIP в Salesresp используются для связи с Клиентами. (Другие поля опущены для краткости.)

Salesresp (адрес, почтовый индекс, prevsale)

Клиенты (adsid, адрес, почтовый индекс)

Транспортные средства (adsid, selldate)

Цель состоит в том, чтобы найти клиентов в таблице SalesResp, которая ранее купила транспортное средство до указанной даты. Они идентифицируются по адресу и adid в Клиентах и ​​Vechiles соответственно.

Я видел обновления столбца с одним соединением и на самом деле задал вопрос об одном из моих собственных обновлений/соединений здесь (UPDATE with INNER JOIN). Но теперь мне нужно сделать это еще на один шаг и использовать обе таблицы для получения всей информации.

я могу получить несколько РЕГИСТРИРУЙТЕСЬ ЗЕЬЕСТ работать:

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'); 

Однако я не могу получить мульти-РЕГИСТРИРУЙТЕСЬ 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) Выключите AutoCommit (если вы еще не)

2) Ремесло выбора/присоединиться, который возвращает набор столбцов, который идентифицирует запись, которую хотите обновить Eg выберите c1, c2, ... из A join B join C ... WHERE ...

3) Измените обновление. Например. update salesrep SET CX = cx где C1 = c1 AND C2 = c2 AND ... (Наличие индекса на C1, C2, ... будет повышать производительность)

4) Commit.

Таким образом, вы не можете беспокоиться о смешивании обновления и соединения, а его выполнение в рамках txn гарантирует, что ничто не сможет изменить результат соединения до того, как ваше обновление пройдет.