2017-09-18 1 views

답변

2

는 단일 테이블 스캔을 수행하는 분석 함수를 사용할 수 있습니다

SELECT v_object_name, 
     n_version1 
FROM (
    SELECT v_object_name, 
     n_version1, 
     COUNT(CASE WHEN n_version1 >= 10 THEN 1 END) 
      OVER (PARTITION BY v_object_name) AS num_invalid 
    FROM your_table 
) 
WHERE num_invalid = 0; 
+0

이것은 내가 찾고있는 쿼리입니다 ... 감사합니다. 오라클 기능을 멋지게 사용했습니다. – Amir

+0

화려한 솔루션! – Amir

+0

여기에 설명 된대로 : https://stackoverflow.com/questions/45795898/conditional-aggregation-performance 조건부 집계의 효율성 대하위 쿼리는 연산자의 색인 및 선택도에 크게 의존합니다. 이 솔루션은 특정 상황에서 차선책 일 수있는 전체 테이블 스캔을 항상 유도합니다. –

2

사용 NOT EXISTS

SELECT * 
    FROM table t1 
    WHERE NOT EXISTS ( 
     SELECT * 
     FROM table t2 
     WHERE t1.v_object_name = t2.v_object_name AND t2.n_version > 10 
    ) 

또는 NOT IN

SELECT * 
    FROM table t1 
    WHERE t1.v_object_name NOT IN ( 
     SELECT t2.v_object_name 
     FROM table t2 
     WHERE t2.n_version > 10 AND t2.v_object_name IS NOT NULL 
    ) 
+0

나는 단지 하나 개의 테이블이있다. 그 테이블 (t1)에서 10보다 많은 버전이없는 오브젝트 목록을 찾아야합니다. 테이블 2가 출력됩니다. 잘못 입력했다고 생각합니다. 나는 그 질문을 수정한다. – Amir

+1

@Amir 내가하지 않았다, 나는 하나의'table'을 가지고있다. 나는 같은 테이블에 대해서't1'과't2'라는 별칭을 사용한다. –

+0

나는 min min을 확인하고있다. – Amir

1

사용 :

SELECT * 
FROM table t1 
WHERE V_OBJECT_NAME NOT IN ( 
    SELECT V_OBJECT_NAME 
    FROM table t2 
    WHERE n_version1 >= 10 
); 
+0

'v_object_name'에 NULL 값이 있다면 –

+0

rigth가 쿼리에 아무 것도 반환하지 않지만 object_name에 null 값을 갖는 것은 의미가 없습니다 –

+0

쿼리가 정확하지만 제 경우에는 효율적이지 않습니다. tq – Amir

1

이 < = 10 그 결과 가입 최대 버전을 가진 v_object_names를 반환하는 파생 테이블 유무 :

,
select t1.v_object_name, t1.n_version1 
from tablename t1 
join (select v_object_name 
     from tablename 
     group by v_object_name 
     having max(n_version1) <= 10) t2 
    on t1.v_object_name = t2.v_object_name 
관련 문제