2012-02-20 4 views
0

일부 테이블에 대한 조인을 작성한 및 두 가지 수준의 순서를 사용하여 데이터를 주문했습니다 - 중 하나는 한 테이블의 기본 키입니다.Ordering By 함께 사용하여 조인 (PLSQL)

이 데이터를 정렬하면 인라인보기와 DISTINCT 절을 사용하여 데이터에서 중복을 제외하고 싶습니다. 여기가 내가 풀려날 곳입니다.

나는 데이터를 구분하거나 구분할 수있는 것처럼 보이지만 결코 동시에 둘 다를 할 수없는 것처럼 보입니다. 이 문제를 해결할 수있는 방법이 있습니까? 아니면 불확실성 원칙에 상응하는 SQL을 발견 했습니까?

이 코드는 정렬 된 데이터를 반환하지만 중복

   SELECT 
        ada.source_tab source_tab 
        , ada.source_col source_col 
        , ada.source_value source_value 
        , ada.ada_id ada_id 
       FROM 
        are_aud_data ada 
        , are_aud_exec_checks aec 
        , are_audit_elements ael 
       WHERE 
         aec.aec_id = ada.aec_id 
        AND ael.ano_id = aec.ano_id 
        AND aec.acn_id = 123456 
        AND ael.ael_type = 1 
       ORDER BY 
        CASE 
        WHEN source_tab = 'Tab type 1' THEN 1 
        WHEN source_tab = 'Tab type 2' THEN 2 
        ELSE 3 
        END 
       ,ada.ada_id ASC; 

이 코드는 중복을 제거하지만 순서를 잃고 ...

SELECT DISTINCT source_tab, source_col, source_value FROM (
       SELECT 
        ada.source_tab 
        , ada.source_col source_col 
        , ada.source_value source_value 
        , ada.ada_id ada_id 
       FROM 
        are_aud_data ada 
        , are_aud_exec_checks aec 
        , are_audit_elements ael 
       WHERE 
         aec.aec_id = ada.aec_id 
        AND ael.ano_id = aec.ano_id 
        AND aec.acn_id = 123456 
        AND ael.ael_type = 1 
       ORDER BY 
        CASE 
        WHEN source_tab = 'Tab type 1' THEN 1 
        WHEN source_tab = 'Tab type 2' THEN 2 
        ELSE 3 
        END 
       ,ada.ada_id ASC 
    ) 
; 

나는 시도하고 포함 된 경우 'ORDER BY와 ada_id '를 선택하면 오류 메시지'ORA-01791 : SELECTED 표현식이 아닙니다 '가 표시되어 나를 격노 케합니다 !!

답변

0

외부 쿼리의 선택된 필드에 ada_id을 포함시키지 않는 이유는 무엇입니까?

+0

ada_id는 기본 키이므로 모든 레코드가 고유합니다 (내 DISTINCT 절을 무효화합니다). 바깥 쪽 쿼리에 "ORDER BY ada_id"를 포함시킬 수있을 것이라고 생각 했겠지만 말했듯이 - 오류를 반환합니다. S – TommyWylde

0
;WITH CTE AS 
(
        SELECT 
        ada.source_tab source_tab 
        , ada.source_col source_col 
        , ada.source_value source_value 
        , ada.ada_id ada_id 
        , ROW_NUMBER() OVER (PARTITION BY [COLUMNS_YOU_WANT TO BE DISTINCT] 
        ORDER BY [your_columns]) rn 
       FROM 
        are_aud_data ada 
        , are_aud_exec_checks aec 
        , are_audit_elements ael 
       WHERE 
         aec.aec_id = ada.aec_id 
        AND ael.ano_id = aec.ano_id 
        AND aec.acn_id = 356441 
        AND ael.ael_type = 1 
       ORDER BY 
        CASE 
        WHEN source_tab = 'Licensed Inventory' THEN 1 
        WHEN source_tab = 'CMDB'    THEN 2 
        ELSE 3 
        END 
       ,ada.ada_id ASC 
) 
select * from CTE WHERE rn<2 
0

외부 쿼리에서 ada_id가 의미없는 것으로 보입니다. 모든 값을 제거하여 고유 한 source_tab 및 source_col로 종결했습니다.

주문 하시겠습니까? (

이 내부 쿼리에서 최소 ada_id을 포함 (테이블 이름은 나에게 적절한 보이더라도) 당신은거야 -

당신은 순서의 드라이버로 설정 각각의 테이블과 컬럼의 최소 ada_id 어쩌면합니다 group by 절이 필요함) 그런 다음 외부 쿼리에서이를 참조하고 정렬하십시오.