foreign - primary key sql




¿Cómo seleccionar filas sin entrada coincidente en otra tabla? (6)

¿Cómo seleccionar filas sin entrada coincidente en ambas tablas?

    select * from [dbo].[EmppDetails] e
     right join [Employee].[Gender] d on e.Gid=d.Gid
    where e.Gid is Null

    union 
    select * from [dbo].[EmppDetails] e
     left join [Employee].[Gender] d on e.Gid=d.Gid
    where d.Gid is Null

Estoy realizando un trabajo de mantenimiento en una aplicación de base de datos y descubrí que, aunque no se utilicen los valores de una tabla en el estilo de las claves externas, no hay restricciones de clave externa en las tablas.

Estoy tratando de agregar restricciones FK en estas columnas, pero me parece que, debido a que ya hay una gran cantidad de datos erróneos en las tablas de errores anteriores que se han corregido ingenuamente, tengo que encontrar las filas que no lo hacen. coincide con la otra tabla y luego elimínelos.

He encontrado 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 yo pueda realizar estas consultas yo mismo, en lugar de ir corriendo a SO para cada tabla en este lío no hay restricciones FK?


Aquí hay una consulta simple:

SELECT t1.ID
FROM Table1 t1
    LEFT JOIN Table2 t2 ON t1.ID = t2.ID
WHERE t2.ID IS NULL

Los puntos clave son:

  1. Se utiliza la LEFT JOIN ; esto devolverá TODAS las filas de la Table1 , independientemente de si hay o no una fila coincidente en la Table2 .

  2. La WHERE t2.ID IS NULL ; esto restringirá los resultados devueltos solo a aquellas filas donde el ID devuelto de la Table2 es nulo; en otras palabras, NO hay registro en la Table2 para esa ID en particular de la Table1 . Table2.ID se devolverá como NULL para todos los registros de Table1 donde la ID no coincida en Table2 .


No sé cuál está optimizado (comparado con @AdaTheDev), pero este parece ser más rápido cuando lo uso (al menos para mí)

SELECT id FROM table_1 EXCEPT SELECT DISTINCT (table1_id) table1_id FROM table_2

Si desea obtener cualquier otro atributo específico, puede utilizar:

SELECT COUNT(*) FROM table_1 where id in (SELECT id FROM table_1 EXCEPT SELECT DISTINCT (table1_id) table1_id FROM table_2);


Puedes optar por las Vistas como se muestra a continuación:

CREATE VIEW AuthorizedUserProjectView AS select t1.username as username, t1.email as useremail, p.id as projectid, 
(select m.role from userproject m where m.projectid = p.id and m.userid = t1.id) as role 
FROM authorizeduser as t1, project as p

y luego trabajar en la vista para seleccionar o actualizar:

select * from AuthorizedUserProjectView where projectid = 49

que produce el resultado como se muestra en la imagen a continuación, es decir, para la columna nula no coincidente se ha completado.

[Result of select on the view][1]

Yo usaría la expresión EXISTS ya que es más poderosa, es decir, puede elegir más precisamente las filas a las que le gustaría unirse, en caso de LEFT JOIN , debe tomar todo lo que está en la tabla unida. Su eficiencia es probablemente la misma que en el caso de LEFT JOIN con prueba nula.

SELECT t1.ID
FROM Table1 t1
WHERE NOT EXISTS (SELECT t2.ID FROM Table2 t2 WHERE t1.ID = t2.ID)

SELECT id FROM table1 WHERE foreign_key_id_column NOT IN (SELECT id FROM table2)

La Tabla 1 tiene una columna a la que desea agregar la restricción de clave foránea, pero los valores en el foreign_key_id_column no coinciden todos con una identificación en la tabla 2.

  1. La selección inicial enumera los identificadores de la tabla1. estas serán las filas que queremos eliminar.
  2. La cláusula 'no está' en la declaración donde limita la consulta a solo filas en las que el valor en el archivo foreign_key_id_column no se encuentra en la lista de identificadores de la tabla 2.
  3. La instrucción de selección entre paréntesis obtendrá una lista de todos los identificadores que se encuentran en la tabla 2.




foreign-keys