Odpowiedzi:
SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL
P : Co się tutaj dzieje?
Odp . : Koncepcyjnie wybieramy wszystkie wiersze table1
i dla każdego wiersza próbujemy znaleźć wiersz table2
o tej samej wartości dla name
kolumny. Jeśli nie ma takiego wiersza, po prostu pozostawiamy table2
część naszego wyniku pustą dla tego wiersza. Następnie ograniczamy nasz wybór, wybierając tylko te wiersze w wyniku, w których pasujący wiersz nie istnieje. Na koniec ignorujemy wszystkie pola z naszego wyniku, z wyjątkiem name
kolumny (tej, z której jesteśmy pewni, że istnieje table1
).
Chociaż może nie być to najbardziej wydajna metoda we wszystkich przypadkach, powinna ona działać w zasadzie w każdym silniku bazy danych, który próbuje zaimplementować ANSI 92 SQL
Możesz albo
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
lub
SELECT name
FROM table2
WHERE NOT EXISTS
(SELECT *
FROM table1
WHERE table1.name = table2.name)
Zobacz to pytanie, aby uzyskać 3 techniki umożliwiające osiągnięcie tego celu
Nie mam wystarczającej liczby punktów do powtórzenia drugiej odpowiedzi. Ale muszę się nie zgodzić z komentarzami do pierwszej odpowiedzi. Druga odpowiedź:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
Czy FAR jest bardziej wydajny w praktyce. Nie wiem dlaczego, ale korzystam z rekordów powyżej 800 tys. I różnica jest ogromna, zważywszy na przewagę nad drugą odpowiedzią zamieszczoną powyżej. Tylko moje 0,02 $
Jest to czysta teoria mnogości, którą można osiągnąć za pomocą minus
operacji.
select id, name from table1
minus
select id, name from table2
SELECT <column_list>
FROM TABLEA a
LEFTJOIN TABLEB b
ON a.Key = b.Key
WHERE b.Key IS NULL;
https://www.cloudways.com/blog/how-to-join-two-tables-mysql/
Uważaj na pułapki. Jeśli pole Name
w Table1
zawierać wartości null jesteś w niespodzianki. Lepsze jest:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT ISNULL(name ,'')
FROM table1)
Oto, co działało dla mnie najlepiej.
SELECT *
FROM @T1
EXCEPT
SELECT a.*
FROM @T1 a
JOIN @T2 b ON a.ID = b.ID
Było to ponad dwa razy szybciej niż jakakolwiek inna metoda, którą wypróbowałem.
Możesz używać EXCEPT
w mssql lub MINUS
w oracle, są one identyczne zgodnie z:
To działa dla mnie ostro
SELECT *
FROM [dbo].[table1] t1
LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID]
WHERE t2.[t2_ID] IS NULL
Zamierzam ponownie opublikować (ponieważ nie jestem jeszcze wystarczająco fajny, aby skomentować) w prawidłowej odpowiedzi ... na wypadek, gdyby ktokolwiek pomyślał, że trzeba to lepiej wyjaśnić.
SELECT temp_table_1.name
FROM original_table_1 temp_table_1
LEFT JOIN original_table_2 temp_table_2 ON temp_table_2.name = temp_table_1.name
WHERE temp_table_2.name IS NULL
I widziałem składnię w FROM wymagającą przecinków między nazwami tabel w mySQL, ale w sqlLite wydawało się, że wolała miejsce.
Najważniejsze jest to, że kiedy używasz złych nazw zmiennych, pozostawia pytania. Moje zmienne powinny mieć większy sens. I ktoś powinien wyjaśnić, dlaczego potrzebujemy przecinka, czy nie przecinka.
Jeśli chcesz wybrać konkretnego użytkownika
SELECT tent_nmr FROM Statio_Tentative_Mstr
WHERE tent_npk = '90009'
AND
tent_nmr NOT IN (SELECT permintaan_tent FROM Statio_Permintaan_Mstr)
Jest tent_npk
to klucz podstawowy użytkownika