복붙노트

[SQL] 다른 테이블에 존재하지 않는 행을 선택

SQL

다른 테이블에 존재하지 않는 행을 선택

나는 두 PostgreSQL의 테이블을 가지고 :

table name     column names
-----------    ------------------------
login_log      ip | etc.
ip_location    ip | location | hostname | etc.

나는 IP_LOCATION의 행이없는 login_log에서 모든 IP 주소를 얻으려면. 나는이 쿼리를 시도했지만 구문 오류가 발생합니다.

SELECT login_log.ip 
FROM login_log 
WHERE NOT EXIST (SELECT ip_location.ip
                 FROM ip_location
                 WHERE login_log.ip = ip_location.ip)

(그것을 작동하도록 조정 포함)이 쿼리는 이러한 목적에 가장 적합한 수행하는 쿼리가있는 경우 나 또한 궁금하네요.

해결법

  1. ==============================

    1.이 작업을 위해 4 개 기술, 그 표준 SQL의 모든 기본적으로있다.

    이 작업을 위해 4 개 기술, 그 표준 SQL의 모든 기본적으로있다.

    종종 빠른 포스트 그레스한다.

    SELECT ip 
    FROM   login_log l 
    WHERE  NOT EXISTS (
       SELECT  -- SELECT list mostly irrelevant; can just be empty in Postgres
       FROM   ip_location
       WHERE  ip = l.ip
       );
    

    또한 고려 :

    때때로 이것은 가장 빠른 것입니다. 종종 짧은. NOT이 존재 종종 같은 쿼리 계획을 초래한다.

    SELECT l.ip 
    FROM   login_log l 
    LEFT   JOIN ip_location i USING (ip)  -- short for: ON i.ip = l.ip
    WHERE  i.ip IS NULL;
    

    짧은. 쉽게 더 복잡한 쿼리에 통합되지 않습니다.

    SELECT ip 
    FROM   login_log
    
    EXCEPT ALL  -- "ALL" keeps duplicates and makes it faster
    SELECT ip
    FROM   ip_location;
    

    (문서 당)이 참고 :

    일반적으로, 당신은 ALL 키워드를 할 것입니다. 당신은 상관하지 않는 경우 더 빠른 쿼리를 만들기 때문에, 여전히 그것을 사용할 수 있습니다.

    만 NULL 값이없는 경우 또는 좋은 제대로 NULL을 처리하기 위해 알고있다. 나는이 목적을 위해 사용하지 않을 것입니다. 성능은 더 큰 테이블 악화 할 수 있습니다.

    SELECT ip 
    FROM   login_log
    WHERE  ip NOT IN (
       SELECT DISTINCT ip  -- DISTINCT is optional
       FROM   ip_location
       );
    

    NOT IN은 양쪽에 NULL 값에 대한 "함정"을 수행합니다 :

    dba.SE에 비슷한 질문은 MySQL을 대상으로 :

  2. ==============================

    2.A.) 명령은 아닙니다 당신이 'S'를 놓치고, 존재한다.

    A.) 명령은 아닙니다 당신이 'S'를 놓치고, 존재한다.

    B.)를 사용하여 NOT IN 대신

    SELECT ip 
      FROM login_log 
      WHERE ip NOT IN (
        SELECT ip
        FROM ip_location
      )
    ;
    
  3. ==============================

    3.고르다 *     testcases1의 t FROM     WHERE NOT 존재 (        SELECT 1        executions1 내가 FROM        WHERE t.tc_id = i.tc_id 및 t.pro_id = i.pro_id 및 pro_id = 7 = 5 VERSION_ID        ) 및 pro_id = 7;

    고르다 *     testcases1의 t FROM     WHERE NOT 존재 (        SELECT 1        executions1 내가 FROM        WHERE t.tc_id = i.tc_id 및 t.pro_id = i.pro_id 및 pro_id = 7 = 5 VERSION_ID        ) 및 pro_id = 7;

    여기 testcases1 표는 모든 datas를 포함하고 executions1 테이블 testcases1 테이블 사이에 일부 데이터가 포함되어 있습니다. 나는 exections1 테이블에 존재하지 않는 경우에만 datas를 검색하고 있습니다. (심지어 당신도 줄 수있는 내부의 조건을 제공하고있다.) 괄호 안에 있어야합니다 데이터를 검색에 존재하지 않아야 조건을 지정합니다.

  4. ==============================

    4.이 또한 시도 할 수 있습니다 ...

    이 또한 시도 할 수 있습니다 ...

    SELECT l.ip, tbl2.ip as ip2, tbl2.hostname
    FROM   login_log l 
    LEFT   JOIN (SELECT ip_location.ip, ip_location.hostname
                 FROM ip_location
                 WHERE ip_location.ip is null)tbl2
    
  5. from https://stackoverflow.com/questions/19363481/select-rows-which-are-not-present-in-other-table by cc-by-sa and MIT license