ID와 레이블이있는 테이블 T가 있습니다.
ID LABEL
1 label_1
2 label_2
3 label_3
레이블 목록이 있습니다.
('label_1', 'label_4', 'label_6' )
테이블 T에 존재하지 않는 것을 선택하고 싶습니다. 제 경우에는 'label_4'와 'label_6'을 얻습니다. SQL에서 어떻게 할 수 있습니까?
이러한 레이블은 외부 값입니다. 스풀을 사용하여 내 테이블에 존재하지 않는 값을 로그 파일에 인쇄하고 싶습니다.
2 편집
기본적으로 거대한 값 목록이기 때문에 현재 pl / SQL을 사용하여 테이블에 모든 값을 넣으려고합니다. 내가 이거 가지고있어:
DECLARE
type array_t is varray(603) of varchar2(50 BYTE);
labels array_t := array_t(
'210',
'label_1',
'label_6',
'label_4'
);
BEGIN
For i in labels LOOP
Insert Into TEMP_LABEL (LABEL)
Values (i);
END LOOP;
commit;
END;
하지만 다음과 같은 오류가 발생 pls-00456 item is not a cursor
합니다. 여기에 갇혀 있습니다.
테이블을 사용하는 솔루션 은 내 sqlfiddle (및 postgres 버전 )을 참조하십시오.
관련 쿼리는 다음과 같습니다.
SELECT T_TEMP.LABEL, T.LABEL
FROM T_TEMP
LEFT JOIN T
ON T_TEMP.LABEL = T.LABEL
WHERE T.LABEL IS NULL;
이러한 값을 저장하는 데 테이블을 사용하지 않는 강력한 이유가 있으면 알려주십시오.
데이터 세트의 크기에 따라 다음 쿼리 중에서 선택하면 성능에 영향을 미칠 수 있습니다 ( 방법을 비교하는 이 훌륭한 설명 참조 ).
-- LEFT JOIN / IS NULL
SELECT T_TEMP.LABEL, T.LABEL
FROM T_TEMP
LEFT JOIN T ON T_TEMP.LABEL = T.LABEL
WHERE T.LABEL IS NULL;
-- NOT EXISTS
SELECT T_TEMP.LABEL
FROM T_TEMP
WHERE NOT EXISTS
(
SELECT T.LABEL
FROM T
WHERE T_TEMP.LABEL = T.LABEL
);
-- NOT IN
SELECT T_TEMP.LABEL
FROM T_TEMP
WHERE LABEL NOT IN
(
SELECT T.LABEL
FROM T
);
데이터 세트가 커지면 LEFT JOIN / IS NULL 또는 NOT EXISTS가 더 잘 수행되어야하지만 이 바이올린 의 실행 계획에 따르면 NOT IN이 가장 낮은 비용으로 수행되는 것 같습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다