programing tip

다른 테이블에없는 행을 선택하십시오.

itbloger 2020. 6. 15. 21:54
반응형

다른 테이블에없는 행을 선택하십시오.


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

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

login_log에 행이없는 모든 IP 주소를 가져오고 싶습니다 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 INNULL양쪽의 값에 대한 "트랩"을 전달합니다 .

MySQL을 대상으로 한 dba.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 ;

Here testcases1 table contains all datas and executions1 table contains some data among testcases1 table. I am retrieving only the datas which are not present in exections1 table. ( and even I am giving some conditions inside that you can also give.) specify condition which should not be there in retrieving data should be inside brackets.


this can also be tried...

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

반응형