SQL: selecciona keys que no existen en una tabla

Tengo una table con una configuration normal de auto inc. IDS. Algunas de las filas se han eliminado, por lo que la list de ID podría verse más o less así:

(1, 2, 3, 5, 8, …)

Luego, desde otra fuente ( Editar: Otra fuente = NO en una database ) Tengo esta matriz:

(1, 3, 4, 5, 7, 8)

Estoy buscando una consulta que pueda usar en la database para get la list de ID: s NO en la tabla de la matriz que tengo. Cuál podría ser:

(4, 7)

¿Existe tal? Mi solución en este momento es crear una tabla temporal para que el command "WHERE table.id IS NULL" funcione, o probablemente sea peor, utilizando la function PHP array_diff para ver lo que falta después de haber recuperado todos los ID de la tabla.

Dado que la list de identificadores se está acercando a millones o filas, estoy ansioso por encontrar la mejor solución.

¡Gracias! / Thomas

Editar 2:

Mi aplicación principal es una tabla bastante fácil que está llena de muchas filas. Esta aplicación se administra utilizando un browser y estoy usando PHP como el intepreter para el código.

Todo en esta tabla se debe exportar a otro sistema (que es un producto de terceros) y todavía no hay forma de hacerlo además de usar manualmente la function de import en ese progtwig. También es posible insert nuevas filas en el otro sistema, aunque la ruta acordada nunca es hacer esto.

El problema es que mi sistema no puede estar 100% seguro de que el usuario hizo todo correctamente desde que presionó la tecla "exportar". O bien, que nunca se han creado filas en el otro sistema.

Desde el otro sistema puedo get un file CSV donde están todas las filas del sistema. Entonces, al comparar el file CSV y mi tabla, puedo ver si: * Faltan algunas filas en el otro sistema que deberían haber sido importadas * Si alguien ha creado filas en el otro sistema

El problema no es "resolverlo". Está haciendo la mejor solución, ya que hay demasiados datos en las filas.

¡Gracias de nuevo!

/ Thomas

Podemos usar MYSQL no en la opción.

SELECT id FROM table_one WHERE id NOT IN ( SELECT id FROM table_two ) 

Editado

Si obtiene la fuente de un file csv , simplemente tiene que poner estos valores directamente como:

Asumo que los CSV son como 1,2,3, …, n

 SELECT id FROM table_one WHERE id NOT IN ( 1,2,3,...,n ); 

EDIT 2

O si desea seleccionar el path mysqlimport puede usar mysqlimport para importar datos en una tabla temporal en la database MySQL y recuperar el resultado y eliminar la tabla.

Me gusta:

Crear table

 CREATE TABLE my_temp_table( ids INT, ); 

carga el file .csv

 LOAD DATA LOCAL INFILE 'yourIDs.csv' INTO TABLE my_temp_table FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (ids); 

Seleccionar loggings

 SELECT ids FROM my_temp_table WHERE ids NOT IN ( SELECT id FROM table_one ) 

colocar la table

 DROP TABLE IF EXISTS my_temp_table 

¿Qué pasa con el uso de una left join ? algo como esto :

 select second_table.id from second_table left join first_table on first_table.id = second_table.id where first_table.is is null 

También podría ir con una sub consulta; dependiendo de la situación, podría, o no, ser más rápido, sin embargo:

 select second_table.id from second_table where second_table.id not in ( select first_table.id from first_table ) 

O con un not exists :

 select second_table.id from second_table where not exists ( select 1 from first_table where first_table.id = second_table.id ) 

La function que está buscando NO ES (un alias para <> ALL)

La documentation de MYSQL:

http://dev.mysql.com/doc/refman/5.0/en/all-subqueries.html

Un ejemplo de su uso:

http://www.roseindia.net/sql/mysql-example/not-in.shtml

¡Disfrutar!

El problema es que T1 podría tener un millón de filas o diez millones de filas, y ese número podría cambiar, por lo que no sabe cuántas filas debe tener su tabla de comparación, T2, la que no tiene vacíos, para hacer un DONDE NO EXISTE o una testing LEFT JOIN para NULL.

Pero la pregunta es, ¿por qué te importa si faltan valores? Yo presento que, cuando una aplicación está correctamente diseñada, no debería importar si hay lagunas en una secuencia de teclas que se autoincrementa. Incluso una aplicación donde las brechas sí importan, como un logging de verificación, no debe utilizar una key primaria de identificación automática como sinónimo del número de verificación.

¿Cuidar para elaborar en su requisito de la aplicación?

OK, he leído tus ediciones / elaboración. Sincronizar dos bases de datos donde se supone que el segundo no debe insert ninguna nueva fila, pero podría hacerlo , parece ser un problema que está por ocurrir.

Ninguno de los enfoques sugeridos anteriormente (DONDE NO EXISTE o LEFT JOIN) es hermético y tampoco es una forma de garantizar la integridad lógica entre los dos sistemas. No le permitirán saber qué sistema creó una fila en situaciones donde ambas tablas contienen una fila con la misma identificación. Ahora te estás enfocando en las lagunas, pero otro problema son las identificaciones duplicadas.

Por ejemplo, si ambas tablas tienen una fila con id 13887, no se puede suponer que database1 creó la fila. Podría haberse insertado en database2, y luego database1 podría insert una nueva fila usando ese mismo id. Tendría que comparar todos los valores de columna para asegurarse de que las filas son iguales o no.

Sugeriría, por lo tanto, que también explore GUID como un reemploop para integers autoincrementing. No puede evitar que database2 inserte filas, pero al less con GUID no se encontrará con un problema donde la segunda database haya insertado una fila y le haya asignado un valor de key primaria que su primera database también podría usar, dando como resultado dos filas diferentes con la misma identificación Las columnas CreationDateTime y LastUpdateDateTime también serían útiles.

Sin embargo, una solución adecuada, si está disponible para usted, es mantener una sola database y dar a los usuarios acceso remoto a ella, por ejemplo, a través de una interfaz web. Eso eliminaría el desorder y la complicación de los problemas de replicación / synchronization.

Si una interfaz web de acceso remoto no es factible, ¿tal vez podría hacer que una de las bases de datos sea de solo lectura? ¿O la database2 tiene que hacer actualizaciones en las filas? ¿Tal vez podrías negar el privilegio de inserción? ¿Qué motor de database estás usando?

Tengo el mismo problema: tengo una list de valores del usuario y quiero encontrar el subset que no existe en la tabla anterior. Lo hice en el oracle construyendo una pseudo-tabla en la statement seleccionada. Aquí hay una manera de hacerlo en Oracle. Pruébalo en MySQL sin el "desde dual":

 -- find ids from user (1,2,3) that *don't* exist in my person table -- build a pseudo table and join it with my person table select pseudo.id from ( select '1' as id from dual union select '2' as id from dual union select '3' as id from dual ) pseudo left join person on person.person_id = pseudo.id where person.person_id is null