이걸로 옳은 길을 가고있는 것 같아요 … SQL이 최고가 아니니 참아주세요
특정 셀이 다른 테이블에 존재하지 않는 한 테이블에서 모든 것을 선택하기 위해 데이터베이스를 쿼리하려고합니다. 그다지 말이 안되지만이 코드가
SELECT * from employees WHERE NOT EXISTS (SELECT name FROM eotm_dyn)
그래서 기본적으로 직원 목록과 세부 정보가있는 테이블이 하나 있습니다. 그런 다음 이름을 포함하여 다른 세부 정보가있는 다른 테이블입니다. eotm_dyn 테이블에 이름이없는 경우 (즉, 항목이없는 경우) 정확히 누구인지 또는 정확히 무엇이 누락되었는지 확인하고 싶습니다.
위의 쿼리는 아무것도 반환하지 않지만 20 개의 이름이 누락되어 있다는 것을 알고 있으므로 분명히 올바르게 이해하지 못했습니다.
누구든지 도울 수 있습니까?
답변
쿼리에서 테이블을 조인하지 않았습니다.
에 레코드가 전혀없는 경우 원래 쿼리는 항상 아무것도 반환하지 않으며이 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
.
답변
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
답변
LEFT JOIN을 수행하고 결합 된 열이 NULL이라고 주장 할 수 있습니다.
예:
SELECT * FROM employees a LEFT JOIN eotm_dyn b on (a.joinfield=b.joinfield) WHERE b.name IS NULL
답변
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을 포함한 다양한 다른 옵션을 사용할 수 있습니다. 그러나 최적화 프로그램은 일반적으로 대부분의 경우 동일하게 처리합니다.