SELECT * 존재하지 않는 곳


94

이걸로 옳은 길을 가고있는 것 같아요 ... SQL이 최고가 아니니 참아주세요

특정 셀이 다른 테이블에 존재하지 않는 한 테이블에서 모든 것을 선택하기 위해 데이터베이스를 쿼리하려고합니다. 그다지 말이 안되지만이 코드가

SELECT * from employees WHERE NOT EXISTS (SELECT name FROM eotm_dyn)

그래서 기본적으로 직원 목록과 세부 정보가있는 테이블이 하나 있습니다. 그런 다음 이름을 포함하여 다른 세부 정보가있는 다른 테이블입니다. eotm_dyn 테이블에 이름이없는 경우 (즉, 항목이없는 경우) 정확히 누구인지 또는 정확히 무엇이 누락되었는지 확인하고 싶습니다.

위의 쿼리는 아무것도 반환하지 않지만 20 개의 이름이 누락되어 있다는 것을 알고 있으므로 분명히 올바르게 이해하지 못했습니다.

누구든지 도울 수 있습니까?

답변:


160

쿼리에서 테이블을 조인하지 않았습니다.

에 레코드가 전혀없는 경우 원래 쿼리는 항상 아무것도 반환하지 않으며이 eotm_dyn경우 모든 항목을 반환합니다.

이러한 테이블이에서 조인되어야한다고 가정 employeeID하고 다음을 사용합니다.

SELECT  *
FROM    employees e
WHERE   NOT EXISTS
        (
        SELECT  null 
        FROM    eotm_dyn d
        WHERE   d.employeeID = e.id
        )

이러한 테이블을 LEFT JOIN키워드로 조인 하고의를 필터링 NULL할 수 있지만을 사용하는 것보다 효율성이 떨어집니다 NOT EXISTS.


30
1 년에 두 번 "WHERE NOT EXISTS"가 필요하고 정확히 사용하는 방법을 항상 잊어 버립니다. 감사합니다.이 예는 지금 북마크됩니다.
Mateng

1
누군가 "LEFT JOIN + NULL 필터가 NOT EXISTS보다 덜 효율적입니다"에 대한 참조를 줄 수 있습니까? 명백 할 수 있지만 문서에서는 본 적이 없습니다. 감사.
toni07

2
@ toni07 사실, 그것은 전설입니다. LEFT JOIN이 이깁니다. explainextended.com/2009/09/18/… .. Quassnoi의 블로그는 항상 유용한 리소스입니다.
Kaii

HAVING 절에서 이것을 어떻게 사용합니까? akagroup by X having exist [row with employeeID = e.id]
phil294

@blauhirn : 단지 같은 그
Quassnoi

83
SELECT * FROM employees WHERE name NOT IN (SELECT name FROM eotm_dyn)

또는

SELECT * FROM employees WHERE NOT EXISTS (SELECT * FROM eotm_dyn WHERE eotm_dyn.name = employees.name)

또는

SELECT * FROM employees LEFT OUTER JOIN eotm_dyn ON eotm_dyn.name = employees.name WHERE eotm_dyn IS NULL

1
NB! NOT IN작동하지 않는 등의 경우 예상 namenull값을. SESSION : 모든 SQL 프로그래머가 알아야 할 10 가지 쿼리 튜닝 기술 (Kevin Kline, Aaron Bertrand) 비디오에서 36 분 20 초부터 시청하십시오 .
hlovdal

12

LEFT JOIN을 수행하고 결합 된 열이 NULL이라고 주장 할 수 있습니다.

예:

SELECT * FROM employees a LEFT JOIN eotm_dyn b on (a.joinfield=b.joinfield) WHERE b.name IS NULL

7
SELECT * from employees
WHERE NOT EXISTS (SELECT name FROM eotm_dyn)

eotm_dyn비어 있지 않으면 레코드를 반환하지 않습니다 . 당신의 기준에 어떤 종류의 필요 SELECT name FROM eotm_dyn와 같은

SELECT * from employees
WHERE NOT EXISTS (
    SELECT name FROM eotm_dyn WHERE eotm_dyn.employeeid = employees.employeeid
)

두 테이블이 외래 키 관계로 연결되어 있다고 가정합니다. 이 시점에서 LEFT JOIN을 포함한 다양한 다른 옵션을 사용할 수 있습니다. 그러나 최적화 프로그램은 일반적으로 대부분의 경우 동일하게 처리합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.