2017-05-19 5 views
0

SQL 쿼리에 대한 도움이 필요합니다. LEFT OUTER JOIN을 사용하여 조인해야하는 두 개의 테이블이 있습니다. 특정보기에 대한 데이터베이스보기. 이름을 찾기 위해 조인에 대한 쿼리를 실행하면 A의 최신 브랜드 "AP"를 가져와야합니다. 표 1최신 값만 반환해야하는 JOIN 쿼리 위에 뷰를 만드는 데 도움이 필요합니다.

ID  name  address 
----------------------- 
1  A   ATL 
2  B   ATL 

표 2

ID  PER_ID brand  DATEE 
-------------------------------------------- 
1  1   MS   5/19/17:1:00pm 
2  1   XB   5/19/17:1:05pm 
3  1   AP   5/19/17:2:00pm 
4  2   RO   5/19/17:3:00pm 
5  2   WE   5/19/17:4:00pm 

나는 올바른 결과를 반환하는 쿼리를 시도했지만 내가 조인의 상단에있는 데이터베이스보기를 빌드 할 때 내가 문제 하나를 얻을. 나는 쿼리 b를 시도했지만 오라클 SQL 개발자에서 내보기를 쿼리 할 때 나는 여전히 모든 결과를 얻지 만 최신 것은 아니다.

쿼리 A :

SELECT * from table_1 
left outer join table_2 on table_1.ID = Table_2.PER_ID 
AND table_2.DATE = (SELECT MAX(DATE) from table_2 z where z.PER_ID = table_2.PER_ID) 

문제 1

Error report - 
ORA-01799: a column may not be outer-joined to a subquery 
01799. 00000 - "a column may not be outer-joined to a subquery" 
*Cause: <expression>(+) <relop> (<subquery>) is not allowed. 
*Action: Either remove the (+) or make a view out of the subquery. 
      In V6 and before, the (+) was just ignored in this case. 

질의 2 :

SELECT * from table_1 
    left outer join(SELECT PER_ID,brand, max(DATEE) from table_2 group by brand,PER_ID) t2 on table_1.ID = t2.PER_ID 

답변

1

사용 row_number() :

select t1.id, t1.name, t1.address, t2.id as t2_id, t2.brand, t2.datee 
from table_1 t1 left outer join 
    (select t2.*, 
      row_number() over (partition by per_id order by date desc) as seqnum 
     from table_2 t2 
    ) t2 
    on t1.ID = t2.PER_ID and t2.seqnum = 1; 

보기를 정의 할 때 명시 적으로 열을 나열하는 습관이 있어야합니다.

+0

답장을 보내 주셔서 감사합니다. 난 오라클 SQL 개발자가 귀하의 코드를 시도했지만 지금은 t2.brand가 유효하지 않은 한정자입니다 – stevestark

+0

그냥 각각에 사용되는 모든 열 이름과 별칭을 확인하십시오. 열 참조가 올바르지 않을 때 생성되는 오류입니다. 테이블 (또는 해당 테이블의 전체 ddl)에 액세스하지 않고는 디버그 할 수 없습니다. 추신 : "날짜 순서에 의한 주문"은 "날짜 별 desc에 의한 주문"이어야한다고 생각합니다. ""e "가 누락되었습니다. –

+0

감사합니다. 나는이 해결책에 관한 한 가지 질문을 가지고있다. 가능한 가장 빠른 솔루션입니까? 테이블 3,4,5를 추가하고 각각 왼쪽에 외부 조인을 할 경우 지연이 발생합니까? – stevestark