programing

항목이 다른 테이블에 없는지 확인하는 중

powerit 2023. 3. 14. 21:58
반응형

항목이 다른 테이블에 없는지 확인하는 중

테이블은 다음과 같이 세팅되어 있습니다.

table name: process
fields: name, id_string

table name: value_seach
fields: id_string, value

value_search에 엔트리가 없는 프로세스 이름(각 id_string)을 모두 표시하는 선택문을 작성하려고 합니다.

프로세스 테이블의 id_string은 null일 수 있으며 이름은 가질 수 있지만 가능하면 제외해야 합니다.value_search의 id_string은 null일 수 없습니다.

이거 어떻게 해?

일반적으로 다른 테이블에 존재하지 않는 행을 원하는 경우 다른 테이블에 LEFT JOIN하고 WHERE...두 번째 테이블의 컬럼에 대해서는 IS NULL입니다.또한 process.id_string이 NULL인 행을 원하지 않는다고 언급했습니다.

SELECT p.name, p.id_string
FROM
    process p
    LEFT JOIN value_search v
        ON v.id_string = p.id_string
WHERE
    v.id_string IS NULL
    AND p.id_string IS NOT NULL

이것은 안티 조인이라고 알려져 있습니다.

사용하는 것 같습니다.Not Exists여기서 하는 게 최선일 거야

SELECT p.name, p.id_string
FROM process p
WHERE 
   NOT p.id_string IS NULL AND
   NOT EXISTS(
          SELECT NULL
          FROM value_search v
          WHERE p.id_string = v.id_string)

원하는 쿼리는 다음과 같습니다.WHERE 절의 서브쿼리보다 JOIN이 훨씬 빠릅니다.

SELECT p.name, p.id_string
FROM process p
LEFT OUTER JOIN value_search v
   ON p.id_string = v.id_string
   AND p.id_string IS NOT NULL
   AND v.id_string IS NULL

위의 쿼리에서 동일하게 유효한 변형은 다음과 같습니다.

SELECT p.name, p.id_string
FROM process p
LEFT OUTER JOIN value_search v
   ON p.id_string = v.id_string
WHERE
   p.id_string IS NOT NULL
   AND v.id_string IS NULL
SELECT 
  name,
  id_string
FROM process
WHERE id_string IS NOT NULL AND id_string NOT IN SELECT id_string FROM value_seach

언급URL : https://stackoverflow.com/questions/9366021/checking-whether-an-item-does-not-exist-in-another-table

반응형