programing

다른 테이블에 없는 행 선택

yellowcard 2023. 4. 20. 20:46
반응형

다른 테이블에 없는 행 선택

다음 두 개의 postgresql 테이블이 있습니다.

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

모든 IP 주소를 취득하고 싶다.login_log행이 없는 것ip_location.
이 쿼리를 시도했지만 구문 오류가 발생합니다.

SELECT login_log.ip 
FROM login_log 
WHERE NOT EXIST (SELECT ip_location.ip
                 FROM ip_location
                 WHERE login_log.ip = ip_location.ip)
ERROR: syntax error at or near "SELECT"
LINE 3: WHERE NOT EXIST (SELECT ip_location.ip`

또한 이 쿼리가 (동작하도록 조정된) 가장 성능이 좋은 쿼리인지 궁금합니다.

이 작업에는 기본적으로 4가지 기술이 있으며 모두 표준 SQL입니다.

NOT EXISTS

Postgres에서 가장 빠른 경우가 많습니다.

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
   );

다음 사항도 고려해야 합니다.

LEFT JOIN / IS NULL

이게 가장 빠를 때가 있어요.종종 가장 짧다.대부분의 경우 와 같은 쿼리 계획이 발생합니다.NOT EXISTS.

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;

EXCEPT

짧고 복잡한 질의에 쉽게 통합되지 않습니다.

SELECT ip 
FROM   login_log

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

(매뉴얼에 따라) 다음 사항에 주의해 주십시오.

중복되는 경우는 제외됩니다.EXCEPT ALL사용됩니다.

일반적으로, 여러분은ALL키워드를 지정합니다.상관 없는 경우 쿼리를 더 빠르게 할 수 있으므로 계속 사용하십시오.

NOT IN

없는 것만이 좋다null값 또는 처리 방법을 알고 있는 경우null적절히.나는 이것을 이런 목적으로 사용하지 않을 이다.또한 테이블이 클수록 성능이 저하될 수 있습니다.

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

NOT IN함정을 품다null값을 지정합니다.

dba에 대해서도 같은 질문입니다.MySQL 대상 SE:

A.) 명령이 존재하지 않습니다. 'S'가 누락되었습니다.

B.) 대신 NOT IN 사용

SELECT ip 
  FROM login_log 
  WHERE ip NOT IN (
    SELECT ip
    FROM ip_location
  )
;

SELECT * FROM testcases1 t WHERE NOT EXISTS ( SELECT 1
FROM executions1 i WHERE t.tc_id = i.tc_id and t.pro_id=i.pro_id and pro_id=7 and version_id=5 ) and pro_id=7 ;

여기 testcase1 테이블에는 모든 데이터가 포함되어 있으며 executions1 테이블에는 testcase1 테이블 간의 데이터가 포함되어 있습니다.exceptions1 표에 없는 데이터만을 취득하고 있습니다.(또한 당신이 줄 수 있는 몇 가지 조건을 기재하고 있습니다.) 데이터 취득에 있어서는 있어서는 안 되는 조건을 괄호 안에 넣어야 합니다.

이것도 시도해 볼 수 있다...

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

언급URL : https://stackoverflow.com/questions/19363481/select-rows-which-are-not-present-in-other-table

반응형