2014-10-07 2 views
0

Java DB를 사용하고 있습니다 (Java DB는 Apache Derby의 오라클 지원 버전이며 Apache Derby와 동일한 바이너리를 포함합니다.) 소스 : http://www.oracle.com/technetwork/java/javadb/overview/faqs-jsp-156714.html#1q2.다중 조인을 사용하여 테이블 업데이트

하나의 테이블에서 열을 업데이트하려고하지만 정확한 결과 (내 디자인이나 선택 사항이 아님)를 얻으려면 동일한 데이터베이스 내의 다른 두 테이블과이 테이블을 조인해야합니다.

다음은 세 개의 테이블입니다. ADSID는 Vehicles와 Customers를 연결하는 키이고 Salesresp의 ADDRESS 및 ZIP은 Customers와 연결하는 데 사용됩니다. (다른 필드는 간결하게하기 위해 왼쪽으로.)

Salesresp (주소, 우편, prevsale)

고객 (adsid, 주소, 우편 번호)

차량 (adsid, selldate)

목표는 이전에 지정된 날짜 이전에 차량을 구입 한 SalesResp 테이블에서 고객을 찾는 것입니다. 고객 및 Vechiles의 주소 및 adsid로 식별됩니다.

단일 조인을 사용하여 열에 대한 업데이트를 보았고 여기에 내 자신의 업데이트/조인 중 하나 (UPDATE with INNER JOIN)에 대한 질문을 실제로 보았습니다. 하지만 이제는 한 걸음 더 나아가서 모든 정보를 얻기 위해 두 테이블을 모두 사용해야합니다.

내가 다 가입 SELECT 문이 작업을 얻을 수 있습니다 : 나는 다중 가입 UPDATE 문이 동작하지 않습니다 그러나

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

그리고이 오류가 제공하고 있습니다 :

I는 다음과 같이 업데이트를 시도하려고했습니다 "오류 코드 30000, SQL 상태 21000 : 스칼라 서브 쿼리는 단 하나의 행을 반환 할 수 있습니다."

하지만 "IN"으로 바꾸면 "IN"(오류 코드 30000, SQL 상태 42X01)이 발생하여 구문 오류가 발생합니다.

나는 또한 뻔뻔스러운 내부 조인을 시도했지만이 코드를 실행하려고 시도 할 때 "FROM"코드를 사용하는 것에 대해 불평하는 "Error code 30000, SQL state 42X01" 예어.

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

그리고 다른 구성에서

:

는 "INNER"불쾌 발견
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)/A를 선택 크래프트 기록을 식별하는 열 집합을 반환하는 조인이있는 경우 예 : 업데이트하고 싶다. 조인 B 조 C ... 조인 어디에서 ... c1, c2, ...를 선택하십시오 ...

3) 업데이트를 발행하십시오. 예 : salesrep 업데이트 SET CX = cx 여기서 C1 = c1 AND C2 = c2 AND ... (C1, C2, ...에 대한 색인은 성능을 향상시킵니다)

4) 커밋하십시오.

그런 식으로 업데이트와 조인을 혼합하는 것에 대해 걱정할 필요가 없으며 txn에서 수행하면 업데이트가 완료되기 전에 조인 결과를 변경할 수 없습니다.

관련 문제