J'ai les deux tables SQL suivantes (dans MySQL):
Phone_book
+----+------+--------------+
| id | name | phone_number |
+----+------+--------------+
| 1 | John | 111111111111 |
+----+------+--------------+
| 2 | Jane | 222222222222 |
+----+------+--------------+
Call
+----+------+--------------+
| id | date | phone_number |
+----+------+--------------+
| 1 | 0945 | 111111111111 |
+----+------+--------------+
| 2 | 0950 | 222222222222 |
+----+------+--------------+
| 3 | 1045 | 333333333333 |
+----+------+--------------+
Comment savoir quels appels ont été passés par des personnes qui phone_number
ne sont pas dans le Phone_book
? La sortie souhaitée serait:
Call
+----+------+--------------+
| id | date | phone_number |
+----+------+--------------+
| 3 | 1045 | 333333333333 |
+----+------+--------------+
Toute aide serait très appréciée.
SELECT *
de la sous-requête. Au lieu de cela, par exempleSELECT 1
, devrait être assez joli.Devrait supprimer la sous-requête, permettant à l'optimiseur de requête de travailler sa magie.
Évitez également "SELECT *" car cela peut casser votre code si quelqu'un modifie les tables ou les vues sous-jacentes (et c'est inefficace).
la source
1:N
relation entre vos deux tables. OU ajoutezDISTINCT
comme vu dans la réponse de VladoLe code ci-dessous serait un peu plus efficace que les réponses présentées ci-dessus lorsqu'il s'agit de grands ensembles de données.
la source
Call
, s'il y a plusieurs lignes correspondantes dansPhone_book
. Autrement dit, s'il existe une1:N
relation entre vos deux tables.LEFT OUTER JOIN
, voyez si ses performances sont meilleures.Cela renverra les identifiants supplémentaires qui manquent dans votre table Phone_book.
la source
je pense
la source
id
colonne ducall
tableau n'est pas la même valeur que laid
colonne duPhone_book
tableau, vous ne pouvez donc pas vous associer à ces valeurs. Voir la réponse de WOPR pour une approche similaire.la source
la source
Alternativement,
la source