2015-01-19 4 views
-1

문제가 있습니다. 테이블에서 복제본을 표시하려고합니다.테이블에서 복제본을 표시하는 방법은 무엇입니까?

이 관계 나 관심 c.contract_nr

SELECT intermediary_nr, beneficiary_role, contract_nr 
    FROM (SELECT * 
      from (select intermediary_nr, 
         beneficiary_role, 
         max(contract_nr) contract_nr 
        from boscs.atcs_commission_beneficiary 
       where beneficiary_role = 'LEAD' 
        and intermediary_nr is not null 
       group by intermediary_nr, beneficiary_role 
       ORDER BY dbms_random.value) 

     union all 
     SELECT * 
      from (select intermediary_nr, 
         beneficiary_role, 
         max(contract_nr) contract_nr 
        from boscs.atcs_commission_beneficiary 
       where beneficiary_role = 'SUP_FOR_LEAD' 
        and intermediary_nr is not null 
       group by intermediary_nr, beneficiary_role 
       ORDER BY dbms_random.value) 

     union all 
     SELECT * 
      from (select intermediary_nr, 
         beneficiary_role, 
         max(contract_nr) contract_nr 
        from boscs.atcs_commission_beneficiary 
       where beneficiary_role = 'COAGENT' 
        and intermediary_nr is not null 
       group by intermediary_nr, beneficiary_role 
       ORDER BY dbms_random.value)) 

enter image description here

선택 intermediary_nr, beneficiary_role, contract_nt 경우 a.contract_nr = b.contract_nr = PL SQL

에 내 코드입니다. 이 문제를 해결하는 방법에 대한 조언을 부탁드립니다. 아이디어가 있습니까? a, b, c에 대해 동일한 contract_nr 인 정보 만 표시하려고합니다. 나머지는 그렇지 않습니다. 누구든지이 질문을 완료하는 방법을 알고 있습니까?

+1

질문이 표시되지 않습니다. 나는 당신이 성취하려는 것을 따르지 않습니다. 내가 게시 한 코드가 오류를 던지고 있는지 여부, 원하는 결과를 얻지 못하고 있는지, 또는 다른 것이 있는지 여부는 확실하지 않습니다. 이런 종류의 쿼리에서 왜 dbms_random.value 명령을 사용했는지 짐작할 수 없습니다. 재현 가능한 테스트 케이스를 원하는 결과와 함께 게시하면 탁월한 도움이 될 것입니다. –

+0

내 코드는 하위 쿼리와 일치하는 3 개의 결과를 모두 throw합니다. 위의 관계를 만족하는 복제 만 보여주고 싶습니다. contract_nr first subquery = contract_nr of 2 subquery = 3 subqueries의 contract_nr –

+0

죄송 합니다만,이 문맥에서 "중복 만"이라는 것이 무엇인지 모르겠습니다. 어쩌면 당신은'합집합 '이 아닌'교차'를 사용하려고합니다. 그러나 그것은 어둠 속에서 나를 찾아 다니는 것입니다.재현 가능한 테스트 사례가 도움이 될 것입니다. ! http://i.stack.imgur.com/TzKbF.png 선택 intermediary_nr, beneficiary_role, contract_nt 경우 a.contract_nr = b.contract_nr : –

답변

0

요청을 이해하면 세 가지 결과 집합 모두에서 동일한 계약서가있는 행만 표시하려고합니다. 그렇다면 아무런 문제가 없습니다.

먼저 쿼리를 다소 조여 봅시다. 오직 하나만 필요로하는 문구는 일곱 (!) SELECT입니다. 어떤 목적에 봉사하지 않는 것 때문에

나는 order by 절을 생략했습니다.

이 이런 식으로 좀 결과 세트를 생성합니다

intermediary_nr beneficiary_role contract_nr 
=============== ================ =========== 
      ... ...    ... 
      10 LEAD    100 
      10 SUP_FOR_LEAD  100 
      20 LEAD    101 
      20 SUP_FOR_LEAD  101 
      20 COAGENT   101 
      30 COAGENT   101 
      ... ...    ... 

이의 나머지 부분

intermediary_nr beneficiary_role contract_nr 
=============== ================ =========== 
      ... ...    ... 
      10 LEAD    100 
      10 SUP_FOR_LEAD  100 
      20 LEAD    101 
      20 SUP_FOR_LEAD  101 
      20 COAGENT   101 
      ... ...    ... 

을, 나는 다음과 같은 출력이 불가능하다는 가정을 만들고 있어요 나는 당신의 데이터가 어떻게 생겼는지 모르겠다. 그래서 그것이 유효한 가정인지 나는 모른다. 당신 만이 대답 할 수 있습니다.

이제 세 가지 역할 모두에 대해 동일한 계약 번호가 나타나는 행만 필요합니다. 우리는 두 번째 쿼리에 첫 번째 쿼리의 결과를 공급할 경우 내 예에서, 즉 101 일 것입니다, 우리는 그 결과에 대한 더 많은 그룹화를 수행 할 수 있습니다

select contract_nr 
from  <query above> 
group by contract_nr 
having count(*) = 3; 

이 당신에게 당신이 계약의 목록을 제공합니다 찾고. 생성

with 
ContractByRole(intermediary_nr, beneficiary_role, contract_nr)as(
    select intermediary_nr, beneficiary_role, max(contract_nr) contract_nr 
    from boscs.atcs_commission_beneficiary 
    where beneficiary_role in('LEAD', 'SUP_FOR_LEAD', 'COAGENT') 
     and intermediary_nr is not null 
    group by intermediary_nr, beneficiary_role 
), 
AllRoles(contract_nr)as(
    select contract_nr 
    from  ContractByRole 
    group by contract_nr 
    having count(*) = 3 
) 
select cbr.* 
from ContractByRole cbr 
join AllRoles  ar 
    on ar.contract_nr = cbr.contract_nr; 

: 연합 첫 번째 질의에 그 뒤로 당신은 당신이 결과는 (내가) 희망을 찾고 있습니다

intermediary_nr beneficiary_role contract_nr 
=============== ================ =========== 
      20 LEAD    101 
      20 SUP_FOR_LEAD  101 
      20 COAGENT   101 

중간 값은 내가 보여 패턴을 따르지 않는 경우, 이를 보상하기 위해 쿼리를 약간 조정해야하지만 어렵지는 않습니다.

+0

나는 귀하의 코드를 가지고 있고 성명서를 가지고 있습니다 : 지원되지 않는 컬럼 앨리어싱 –

+0

http://sqlfiddle.com/#!4/9b0b0/1/0 참조 – TommCatt

관련 문제