Πώς να επιλέξετε όλες τις εγγραφές από έναν πίνακα που δεν υπάρχουν σε έναν άλλο πίνακα;

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

Σχόλια (14)

Μπορείτε είτε να κάνετε

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 τεχνικές για να το πετύχετε αυτό

Σχόλια (6)

Αυτό είναι καθαρή θεωρία συνόλων, την οποία μπορείτε να επιτύχετε με την πράξη minus.

select id, name from table1
minus
select id, name from table2
Σχόλια (4)