2017-11-20 19 views
0

존재 화면 필터에만 존재하며 프로 시저에서 처리됩니다. 직원이 활동에 할당되었지만 회사와 계약이없는 경우 계약의 특수 유형이 반환됩니다 (NVL). 직원은 계약이 없으므로 표에 없습니다 VM_CONTRATO. 이런 식으로 필터링 할 때이 조건이 충족되지 않습니다.오라클 조건은 내가 절차상의 <code>EXISTS</code> 조건을 수행 할

이 경우 특수 유형을 어떻게 고려합니까? 나는 몇 가지 방법을 시도해 봤지만 일하지 않았습니다. 모든 팁이나 권장 사항?

직원이 할당 된 ACTIVITIES에 대해 선택한 필터 중 계약 유형이 직원에게 있는지 여부를 확인하려면 VM_CONTRATO을 참조하십시오.

예 :

표 활동 :

Id EmployeeId NameActivity 
-- ---------- ----------- 
1 Employee1  Act1  
2 Employee2  Act2 
3 Employee3  Act3 

표 VM_CONTRACT :

Id EmployeeId TypeContract 
-- ---------- ------------ 
1 Employee1  Type 1 
2 Employee2  Type 2 

난의 특별한 유형으로 필터링하면 세 가지 활동, 반환되는 활동을 조회 할 경우 활동 인 경우 employee3이 계속 반환되어야하지만 현재로서는 그렇지 않습니다.

편집 1 : 나는 분명 아니었다면

죄송합니다, 여기에 몇 가지 자세한 내용은 다음과 같습니다.

이것은 프로 시저에서 생성 된 쿼리 구조의 템플릿입니다. 주석 처리 된 코드는 "본드 (Bond)"필터 (사용자가 보낸 매개 변수)를 수행하는 데 사용 된 양식입니다. 그러나 전송 된 매개 변수를 기반으로 전체 결과를 필터링하지 않도록 필터의 컨텍스트를 변경하는 것이 아니라 직원 또는 직원이 "본드"를 가지고 있는지 식별하여 모든 할당을 반환해야합니다. 직원은 설문 조사 기간에 여러 유형의 링크가있을 수 있습니다.

EXISTS 코드가 추가되었지만 "SPECIAL TYPE"필터 유형에는 작동하지 않습니다. 이 경우 직원이 계약을하지 않고 서비스를 제공하고 있기 때문에 (그는 활동에 배정 됨)

기존 필터와 "특수 유형"필터를 모두 충족하는 단일 조건을 만드는 방법이 필요합니다 .

SELECT FILTER.* 
FROM ( 
    SELECT NVL((SELECT TypeContract FROM VW_CONTRACT WHERE "EmployeeId" = CONTRACT_ALOC."EmployeeId" AND ROWNUM = 1), 'SPECIAL TYPE') as "Bond", 
      CONTRACT_ALOC.* 
    FROM (SELECT ACTIVITY.* 
      FROM 
       (SELECT * 
       FROM OTHER TABLES 
       WHERE OTHER CONDITIONS 
       union all   
       SELECT * 
       FROM ( 
        SELECT * 
        FROM OTHER TABLES 2 
        WHERE OTHER CONDITIONS 2 
        ) ACTIVITY_IRHP 
       WHERE OTHER CONDITIONS 3 
       ) ACTIVITY 
       WHERE TO_DATE('01/09/2000', 'DD/MM/RRRR') BETWEEN ACTIVITY."InicialDate" AND ACTIVITY."FinalDate" 
         AND EXISTS (SELECT NVL(TypeContract, 'SPECIAL TYPE') FROM VW_CONTRACT WHERE "EmployeeId" = ACTIVITY."EmployeeId" AND UPPER(TypeContract) IN ('SPECIAL TYPE') AND ROWNUM = 1) 
         AND ACTIVITY."EmployeeId" IN (3263) 
         ) CONTRACT_ALOC 
         ORDER BY CONTRACT_ALOC."EmployeeName") FILTER; 
         --WHERE LOWER("Bond") IN ('SPECIAL TYPE'); 
+0

"나는 몇 가지 방법을 시도했지만 효과가 없습니다."라고 말합니다. 당신이 시도한 것을 보여주십시오. 그리고 "절차에 따라 치료 받는다"는 것은 무엇을 의미합니까? 자세히 설명해주십시오. –

+0

검색중인 값이 포함되어 있지 않은보기를 쿼리하여 데이터를 필터링하고 싶습니까? Fnord. 당신은 당신이 달성하고자하는 것을 더 자세하게 설명 할 필요가 있습니다. – APC

+0

죄송합니다. 좀 더 자세한 정보를 추가했습니다. 고맙습니다. – cassiom

답변

1

귀하의 요구 사항은 다소 불분명합니다. 그러나 당신이 필요로하는 외부 테이블과 뷰 사이에 조인 것으로 보인다 :

select t.id 
     , t."EmployeeId" 
     , t.NameActivity 
     , nvl(v.contracttype, 'SPECIAL TYPE') as contracttype 
from activity t 
    left outer join vm_contract v 
    on t."EmployeeId" = v."EmployeeId" 

그래서이 쿼리 활동에 기록 된 모든 직원을 반환 VM_CONTRACT의 레코드와 일치하지 않는 모든 직원에게는 계약 유형이 '특수 유형'으로 지정됩니다.

분명히 식별자 이름이 정의 된 다른 모든 장소에 맞게이 쿼리를 편집해야합니다. those abominable double-quotes.

0

문제가 해결되어 SPECIAL TYPE이 매개 변수로 전달 될 때 NOT NOT INDEX 행을 아래 코드와 같이 추가하라는 지시를 받았습니다. 그런 식으로는이 유형의 사례를 반환하지 않습니다. 나는 그것을 테스트했고, 내가 필요한 것에 효과가 있었다.

도움 주셔서 감사합니다.

SELECT FILTER.* 
    FROM ( 
     SELECT NVL((SELECT TypeContract FROM VW_CONTRACT WHERE "EmployeeId" = CONTRACT_ALOC."EmployeeId" AND ROWNUM = 1), 'SPECIAL TYPE') as "Bond", 
       CONTRACT_ALOC.* 
     FROM (SELECT ACTIVITY.* 
       FROM 
        (SELECT * 
        FROM OTHER TABLES 
        WHERE OTHER CONDITIONS 
        union all   
        SELECT * 
        FROM ( 
         SELECT * 
         FROM OTHER TABLES 2 
         WHERE OTHER CONDITIONS 2 
         ) ACTIVITY_IRHP 
        WHERE OTHER CONDITIONS 3 
        ) ACTIVITY 
        WHERE TO_DATE('01/09/2000', 'DD/MM/RRRR') BETWEEN ACTIVITY."InicialDate" AND ACTIVITY."FinalDate" 
          AND (EXISTS (SELECT NVL(TypeContract, 'SPECIAL TYPE') FROM VW_CONTRACT WHERE "EmployeeId" = ACTIVITY."EmployeeId" AND UPPER(TypeContract) IN ('SPECIAL TYPE') AND ROWNUM = 1) 
OR NOT EXISTS (SELECT NVL(TypeContract, 'SPECIAL TYPE') FROM VW_CONTRACT WHERE "EmployeeId" = ACTIVITY."EmployeeId") 
          AND ACTIVITY."EmployeeId" IN (1234) 
          ) CONTRACT_ALOC 
          ORDER BY CONTRACT_ALOC."EmployeeName") FILTER; 
          --WHERE LOWER("Bond") IN ('SPECIAL TYPE');