SQL - Encontrar registros NO estan en tabla

 
Vista:

Encontrar registros NO estan en tabla

Publicado por Angel Francisco (5 intervenciones) el 09/11/2017 22:14:55
Buenas noches a todos,

Tengo la siguiente duda, estoy realizando la tipica query con clausula IN

Algo al estilo de esto.

SELECT *
FROM tabla1
where registros in ('x','y','z','etc,'muchos etc')

El caso es que obviamente esta consulta me dara los resultados que encuentre en la tabla1 con los registros correspondientes.
Yo lo que quiero es que me diga los registros dentro de ese IN, QUE NO ESTAN MOSTRANDO NINGUN RESULTADO.
Si por ejemplo el registro 'y' fuera el unico que no tuviera ningun resultado dentro de la tabla, el resultado que saliera fuera precisamente ese registro 'y'

No equivocar con la tipica duda de respecto a dos tablas, como ver que resultados de una no se encuentran en la tabla,
yo lo necesito hacer solo respecto a 1 UNICA TABLA.

Muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Encontrar registros NO estan en tabla

Publicado por Isaias (1921 intervenciones) el 09/11/2017 22:55:50
No dices que MOTOR de base de datos manejas, la clausula IN es muy antigua y muy lenta, para SQL Server, existen dos clausulas relativamente nuevas, EXISTS, NOT EXISTS, cuya estructura es:

1
2
3
SELECT *
FROM tabla1 t1
WHERE campo (NOT) EXISTS(SELECT * FROM tabla2 t2 WHERE t1.ID = t2.ID)
Espero y esto sirva
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Encontrar registros NO estan en tabla

Publicado por Ángel Francisco (5 intervenciones) el 09/11/2017 23:01:30
Buenas noches,

Gracias por la respuesta.

Pero creo que lo que tu comentas es la tipica query que cruza la existencia o no existencia de una tabla con otra, y yo lo que busco es dentro de una unica tabla.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Encontrar registros NO estan en tabla

Publicado por leonardo_josue (1173 intervenciones) el 10/11/2017 16:10:33
Hola Angel Francisco:

Lo que quieres hacer no es tan simple y el problema radica en la información que tienes guardada en tu tabla, trataré de explicarme con un un ejemplo: supongamos que tienes esta tabla;

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT * FROM tabla;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | uno         |
|    2 | dos         |
|    3 | tres        |
|    4 | cuatro      |
|    5 | cinco       |
+------+-------------+
5 rows in set (0.00 sec)

Ahora, supongamos que tu condición IN la pones así:

1
2
3
SELECT *
FROM tabla
WHERE id IN (1, 2, 3, 6);

de esta condición, los id's 1, 2, 3 SI EXISTEN EN LA TABLA, pero el 6 NO EXISTE...

Ahí es justamente el problema, ya que tú quieres mostrar el ID = 6, pero las consultas SELECT sólo consultan aquello que exista en tu BD, no pueden INVENTAR valores o aparecerlos por arte de magia. Si no existe en la BD's simplemente NO SE PUEDE MOSTRAR.

¿Qué tendrías que hacer?, pues forzosamente tienes que meter ese valor en una tabla (real o virtual) PARA QUE EXISTA EN LA BD's y entonces si poder SELECCIONARLO.

¿Cómo sería esto? dependerá de la BD's con la que estás trabajando, cosa que por cierto ya te habría preguntado el compañero Isaías y que no contestaste. En MySQL por ejemplo, podrías "Simular" una tabla con tus valores:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> SELECT 1 id UNION
    -> SELECT 2 id UNION
    -> SELECT 3 id UNION
    -> SELECT 6 id;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  6 |
+----+
4 rows in set (0.00 sec)

De tal suerte que tu consulta podría quedar más o menos así:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT id FROM
    -> ( SELECT 1 id UNION
    ->   SELECT 2 id UNION
    ->   SELECT 3 id UNION
    ->   SELECT 6 id) T
    -> WHERE id NOT IN (SELECT id FROM tabla);
+----+
| id |
+----+
|  6 |
+----+
1 row in set (0.00 sec)

O mejor aun, tal como lo comentó Isaías, podrías utilizar el EXISTS en lugar del IN para mejorar el rendimiento. haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Encontrar registros NO estan en tabla

Publicado por Ángel Fernandez (5 intervenciones) el 10/11/2017 16:14:24
Muchas gracias por la respuesta.

Estoy con SQL Server, haber si saco un rato este finde y os cuento, de momento me las he apañado con la query IN normal y exportando los resultados a un Excel para hacer un posterior buscarv.

Haber si me pongo este finde y hago la prueba.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar