2014-11-06 3 views
0

작은 수의 행을 가진 테이블에 더 많은 수의 행을 추가하고 작은 테이블의 행을 반복하지 않으려합니다 . 예를 들어오라클 SQL 행 수가 많고 행 수가 적은 행을 조인하고 작은 행을 반복하지 않는 방법

:

people: 
person_id name 
--------- ---- 
1   Dave 
2   Sam 

jobs: 
job_id change_date person_id 
------ ----------- --------- 
1  01-01-2013 1  
2  01-01-2014 1 
3  01-01-2013 2 
4  01-01-2014 2 

select p.name, 
     j.job_id, 
     j.change_date 
from people p, 
     jobs j 
where j.person_id = p.person_id 

반환 값 :

name job_id change_date 
---- ------ ----------- 
Dave 1  01-01-2013 
Dave 2  01-01-2014 
Sam 3  01-01-2013 
Sam 4  01-01-2014 

내가 원하는 :

name job_id change_date 
---- ------ ----------- 
Dave 1  01-01-2013 
    2  01-01-2014 
Sam 3  01-01-2013 
    4  01-01-2014 

오라클 SQL을 사용하여이 가능합니까?

+0

당신은 NULLS를 검색 할 수 있습니다 가입이 명시 적으로 사용하도록 변경 – Multisync

+0

사용자는 Excel과 유사하게 보이므로 형식이 지정되지 않은 데이터가 아닙니다. – Superdooperhero

+0

다음과 같은 질문이 있습니다. http://stackoverflow.com/questions/26768447/problems-with-grouping – Dmitry

답변

1
반복되는 이름 대신에 왜 그런 이름이 필요한가요?
1
select case when row_number() over (partition by p.name order by j.change_date) = 1 then p.name else NULL end as name, 
     j.job_id, 
     j.change_date 
from people p, 
     jobs j 
where j.person_id = p.person_id 
order by p.name, j.change_date; 

분석 함수 ROW_NUMBER를 사용하여 동일한 이름을 계승하고 첫 번째 이름 만 표시 할 수 있습니다. 그러나 결과를 주문해야합니다.

는 ROW_NUMBER는 다음 경우 시퀀스 사람 이름 빈 이름을 부여하는 데 사용할 수있는 일련 번호를 가져올 수 있습니다

>

1은 또한

Select (case when seq=1 then name else '' end) as name, 
     job_id, 
     Change_date 
    From (
     Select p.name, 
      j.job_id, 
      j.change_date, 
     Row_number() over (partition by p.person_id order by job_id desc) as seq 
     from people p 
     Join jobs j 
    On j.person_id = p.person_id) T 
관련 문제