una tablas tabla sobre seleccionar registros que otra existan estan elementos ejemplos datos consultas consultar consulta comparar coincidentes buscar sql mysql

tablas - SQL: busca registros de una tabla que no existen en otra



elementos de una tabla que no estan en otra (8)

Alternativamente,

select id from call minus select id from phone_number

Tengo las siguientes dos tablas SQL (en 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 | +----+------+--------------+

¿Cómo puedo saber qué llamadas fueron hechas por personas cuyo número de phone_number no está en el Phone_book ? La salida deseada sería:

Call +----+------+--------------+ | id | date | phone_number | +----+------+--------------+ | 3 | 1045 | 333333333333 | +----+------+--------------+

Cualquier ayuda sería muy apreciada.


El código a continuación sería un poco más eficiente que las respuestas presentadas anteriormente cuando se trata de conjuntos de datos más grandes.

SELECT * FROM Call WHERE NOT EXISTS (SELECT ''x'' FROM Phone_book where Phone_book.phone_number = Call.phone_number)


Hay varias formas diferentes de hacerlo, con una eficiencia variable, dependiendo de qué tan bueno sea su optimizador de consultas y el tamaño relativo de sus dos tablas:

Esta es la declaración más corta, y puede ser más rápida si su guía telefónica es muy corta:

SELECT * FROM Call WHERE phone_number NOT IN (SELECT phone_number FROM Phone_book)

alternativamente (gracias a Alterlife )

SELECT * FROM Call WHERE NOT EXISTS (SELECT * FROM Phone_book WHERE Phone_book.phone_number = Call.phone_number)

o (gracias a WOPR)

SELECT * FROM Call LEFT OUTER JOIN Phone_Book ON (Call.phone_number = Phone_book.phone_number) WHERE Phone_book.phone_number IS NULL

(ignorando que, como han dicho otros, normalmente es mejor seleccionar solo las columnas que desea, no '' * '')


Yo creo que

SELECT CALL.* FROM CALL LEFT JOIN Phone_book ON CALL.id = Phone_book.id WHERE Phone_book.name IS NULL


SELECT Call.ID, Call.date, Call.phone_number FROM Call LEFT OUTER JOIN Phone_Book ON (Call.phone_number=Phone_book.phone_number) WHERE Phone_book.phone_number IS NULL

Debería eliminar la subconsulta, permitiendo que el optimizador de consultas haga su magia.

Además, evite "SELECT *" porque puede romper su código si alguien altera las tablas o vistas subyacentes (y es ineficiente).


SELECT DISTINCT Call.id FROM Call LEFT OUTER JOIN Phone_book USING (id) WHERE Phone_book.id IS NULL

Esto devolverá los ID adicionales que faltan en la tabla de su Phone_book.


SELECT name, phone_number FROM Call a WHERE a.phone_number NOT IN (SELECT b.phone_number FROM Phone_book b)


SELECT t1.ColumnID, CASE WHEN NOT EXISTS( SELECT t2.FieldText FROM Table t2 WHERE t2.ColumnID = t1.ColumnID) THEN t1.FieldText ELSE t2.FieldText END FieldText FROM Table1 t1, Table2 t2