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