Estoy haciendo un trabajo de mantenimiento en una aplicación de base de datos y descubrí que, alegría de alegrías, a pesar de que los valores de una tabla se utilizan al estilo de las claves externas, no hay restricciones de clave externa en las tablas.
Estoy tratando de agregar restricciones FK en estas columnas, pero estoy descubriendo que, debido a que ya hay una gran cantidad de datos incorrectos en las tablas de errores anteriores que se han corregido ingenuamente, necesito encontrar las filas que no coincidir con la otra tabla y luego eliminarlos.
Encontré algunos ejemplos de este tipo de consulta en la web, pero todos parecen proporcionar ejemplos en lugar de explicaciones, y no entiendo por qué funcionan.
¿Alguien puede explicarme cómo construir una consulta que devuelva todas las filas sin coincidencias en otra tabla, y qué está haciendo, para que pueda hacer estas consultas yo mismo, en lugar de venir a SO para cada tabla en este desastre que tiene sin restricciones FK?
fuente
NULL
identificación es válida en su esquema, es posible que tenga problemas más grandes, ¿no estaría de acuerdo? :)SELECT t1.ID, t2.ID
y elimina la línea WHERE, tendrá una mejor idea de cómo funciona.Usaría
EXISTS
expresión, ya que es más potente, puede, es decir, elegir con mayor precisión las filas a las que desea unir, en caso deLEFT JOIN
que tenga que tomar todo lo que está en la tabla unida. Su eficiencia es probablemente la misma que en el caso de laLEFT JOIN
prueba nula.fuente
EXISTS
es su variabilidad.WHERE t2.id IS NULL
) Gracias.La Tabla 1 tiene una columna a la que desea agregar la restricción de clave externa, pero los valores en el
foreign_key_id_column
no coinciden con losid
de la tabla 2.id
s de la tabla1. Estas serán las filas que queremos eliminar.NOT IN
cláusula en la instrucción where limita la consulta a solo filas donde el valor enforeign_key_id_column
no está en la lista de la tabla 2id
s.SELECT
declaración entre paréntesis obtendrá una lista de todos losid
correos electrónicos que se encuentran en la tabla 2.fuente
IN
cláusula con una lista de valores literales. No se aplica al uso de unaIN
cláusula con el resultado de una subconsulta. Esa respuesta aceptada a esa pregunta en realidad resuelve el problema mediante el uso de una subconsulta. (Una gran lista de valores literales es problemática porque crea una gran expresión SQL. Una subconsulta funciona bien porque, incluso si la lista resultante es grande, la expresión SQL en sí es pequeña.)¿Dónde
T2
está la tabla a la que está agregando la restricción?Y borra los resultados.
fuente
Tengamos las siguientes 2 tablas (salario y empleado)
Ahora quiero esos registros de la tabla de empleados que no están en salario. Podemos hacer esto de 3 maneras:
fuente
De una pregunta similar aquí MySQL Inner Join Query para obtener registros que no están presentes en otra tabla Tengo esto para trabajar
smalltable
es donde le faltan registros,bigtable
es donde tiene todos los registros. La consulta enumera todos los registros que no existen en elsmalltable
archivobigtable
. Puede reemplazarid
por cualquier otro criterio coincidente.fuente
Puede optar por Vistas como se muestra a continuación:
y luego trabaje en la vista para seleccionar o actualizar:
que produce el resultado como se muestra en la imagen a continuación, es decir, para la columna nula no coincidente se ha completado.
fuente
No sabía cuál está optimizado (en comparación con @AdaTheDev), pero este parece ser más rápido cuando lo uso (al menos para mí)
Si desea obtener cualquier otro atributo específico, puede usar:
fuente
SELECT * FROM First_table MINUS SELECT * FROM another
fuente
Puedes hacer algo como esto
fuente
¿Cómo seleccionar filas sin entrada coincidente en ambas tablas?
fuente