Eu tenho as seguintes duas tabelas SQL (no 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 |
+----+------+--------------+
Como descobrir quais chamadas foram feitas por pessoas que phone_number
não estão na Phone_book
? A saída desejada seria:
Call
+----+------+--------------+
| id | date | phone_number |
+----+------+--------------+
| 3 | 1045 | 333333333333 |
+----+------+--------------+
Qualquer ajuda seria muito apreciada.
SELECT *
na subconsulta. Em vez disso, por exemploSELECT 1
, deve ser bastante bonito.Deve remover a subconsulta, permitindo que o otimizador de consultas trabalhe sua mágica.
Além disso, evite "SELECT *", pois isso pode danificar seu código se alguém alterar as tabelas ou visualizações subjacentes (e é ineficiente).
fonte
1:N
relacionamento entre suas duas tabelas. Ou adicioneDISTINCT
como visto na resposta de VladoO código abaixo seria um pouco mais eficiente do que as respostas apresentadas acima ao lidar com conjuntos de dados maiores.
fonte
Call
, se houver várias linhas correspondentesPhone_book
. Ou seja, se houver um1:N
relacionamento entre suas duas tabelas.LEFT OUTER JOIN
, veja se seu desempenho é melhor.Isso retornará os IDs extras ausentes na tabela Phone_book.
fonte
eu acho que
fonte
id
coluna nacall
tabela não tem o mesmo valor que aid
coluna naPhone_book
tabela, portanto você não pode ingressar nesses valores. Veja a resposta do WOPR para uma abordagem semelhante.fonte
fonte
Alternativamente,
fonte