"n_version1"에 숫자가없는 개체 목록을 분리 할 방법을 찾고 있습니다. 10 세 이상입니까?버전이 특정 숫자보다 크지 않은 객체 목록을 찾는 방법은 무엇입니까?
출력은 다음과 같아야한다 :
I 데에 열 n_version1 합산하려고하지만 정확한 방법이 아니었다. Pl/SQL, oracle 9i를 사용하고 있습니다.
"n_version1"에 숫자가없는 개체 목록을 분리 할 방법을 찾고 있습니다. 10 세 이상입니까?버전이 특정 숫자보다 크지 않은 객체 목록을 찾는 방법은 무엇입니까?
출력은 다음과 같아야한다 :
I 데에 열 n_version1 합산하려고하지만 정확한 방법이 아니었다. Pl/SQL, oracle 9i를 사용하고 있습니다.
는 단일 테이블 스캔을 수행하는 분석 함수를 사용할 수 있습니다
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;
사용 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
)
사용 :
SELECT *
FROM table t1
WHERE V_OBJECT_NAME NOT IN (
SELECT V_OBJECT_NAME
FROM table t2
WHERE n_version1 >= 10
);
'v_object_name'에 NULL 값이 있다면 –
rigth가 쿼리에 아무 것도 반환하지 않지만 object_name에 null 값을 갖는 것은 의미가 없습니다 –
쿼리가 정확하지만 제 경우에는 효율적이지 않습니다. tq – Amir
이 < = 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
이것은 내가 찾고있는 쿼리입니다 ... 감사합니다. 오라클 기능을 멋지게 사용했습니다. – Amir
화려한 솔루션! – Amir
여기에 설명 된대로 : https://stackoverflow.com/questions/45795898/conditional-aggregation-performance 조건부 집계의 효율성 대하위 쿼리는 연산자의 색인 및 선택도에 크게 의존합니다. 이 솔루션은 특정 상황에서 차선책 일 수있는 전체 테이블 스캔을 항상 유도합니다. –