Myślę, że z tym podążam właściwą ścieżką ... Proszę o wyrozumiałość, ponieważ mój SQL nie jest najlepszy
Próbuję wysłać zapytanie do bazy danych, aby wybrać wszystko z jednej tabeli, w której określone komórki nie istnieją w innej. To nie ma większego sensu, ale mam nadzieję, że ten fragment kodu będzie
SELECT * from employees WHERE NOT EXISTS (SELECT name FROM eotm_dyn)
Zasadniczo mam jedną tabelę z listą pracowników i ich danymi. Następnie kolejna tabela z innymi szczegółami, w tym ich nazwą. Tam, gdzie w tabeli eotm_dyn nie ma nazwy, co oznacza, że nie ma dla nich wpisu, chciałbym zobaczyć dokładnie, kim są, czyli innymi słowy, zobaczyć, czego dokładnie brakuje.
Powyższe zapytanie nic nie zwraca, ale wiem, że brakuje 20 nazwisk, więc najwyraźniej nie zrozumiałem tego poprawnie.
Czy ktoś może pomóc?
group by X having exist [row with employeeID = e.id]
SELECT * FROM employees WHERE name NOT IN (SELECT name FROM eotm_dyn)
LUB
SELECT * FROM employees WHERE NOT EXISTS (SELECT * FROM eotm_dyn WHERE eotm_dyn.name = employees.name)
LUB
SELECT * FROM employees LEFT OUTER JOIN eotm_dyn ON eotm_dyn.name = employees.name WHERE eotm_dyn IS NULL
źródło
NOT IN
nie działa zgodnie z oczekiwaniami, jeśliname
manull
wartości. Obejrzyj wideo od 36 min do 20 s. SESJA: 10 technik dostrajania zapytań, które powinien znać każdy programista SQL (Kevin Kline, Aaron Bertrand) .Możesz wykonać LEFT JOIN i potwierdzić, że połączona kolumna ma wartość NULL.
Przykład:
SELECT * FROM employees a LEFT JOIN eotm_dyn b on (a.joinfield=b.joinfield) WHERE b.name IS NULL
źródło
SELECT * from employees WHERE NOT EXISTS (SELECT name FROM eotm_dyn)
Nigdy nie zwraca żadnych rekordów, chyba że
eotm_dyn
jest pusta. Musisz mieć jakieś kryteria naSELECT name FROM eotm_dyn
polubienieSELECT * from employees WHERE NOT EXISTS ( SELECT name FROM eotm_dyn WHERE eotm_dyn.employeeid = employees.employeeid )
zakładając, że dwie tabele są połączone relacją klucza obcego. W tym momencie możesz skorzystać z wielu innych opcji, w tym LEFT JOIN. Jednak w większości przypadków optymalizator będzie obsługiwał je w ten sam sposób.
źródło
Możesz również rzucić okiem na to powiązane pytanie . Ten użytkownik zgłosił, że użycie sprzężenia zapewniło lepszą wydajność niż użycie zapytania podrzędnego.
źródło