table1 (id, name) table2 (id, name)
Ερώτηση:
SELECT name
FROM table2
-- that are not in table1 already
SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL
Q: Τι συμβαίνει εδώ;
A: Για κάθε γραμμή προσπαθούμε να βρούμε μια γραμμή στον πίνακα 2 με την ίδια τιμή για τη στήλη "όνομα". Εάν δεν υπάρχει τέτοια γραμμή, αφήνουμε το τμήμα table2
του αποτελέσματός μας κενό για τη συγκεκριμένη γραμμή. Στη συνέχεια, περιορίζουμε την επιλογή μας επιλέγοντας μόνο τις γραμμές του αποτελέσματος στις οποίες δεν υπάρχει η αντίστοιχη γραμμή. Τέλος, αγνοούμε όλα τα πεδία από το αποτέλεσμά μας εκτός από τη στήλη name
(αυτή που είμαστε σίγουροι ότι υπάρχει, από τον table1
).
Αν και μπορεί να μην είναι η πιο αποδοτική μέθοδος που είναι δυνατή σε όλες τις περιπτώσεις, θα πρέπει να λειτουργεί βασικά σε κάθε μηχανή βάσης δεδομένων που προσπάθησε ποτέ να υλοποιήσει την ANSI 92 SQL
Μπορείτε είτε να κάνετε
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
ή
SELECT name
FROM table2
WHERE NOT EXISTS
(SELECT *
FROM table1
WHERE table1.name = table2.name)
Δείτε αυτή την ερώτηση για 3 τεχνικές για να το πετύχετε αυτό
Αυτό είναι καθαρή θεωρία συνόλων, την οποία μπορείτε να επιτύχετε με την πράξη minus
.
select id, name from table1
minus
select id, name from table2