ejemplos - foreign key sql server ejemplo
¿Cómo seleccionar filas sin entrada coincidente en otra tabla? (8)
¿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:
Se utiliza la
LEFT JOIN
; esto devolverá TODAS las filas de laTable1
, independientemente de si hay o no una fila coincidente en laTable2
.La
WHERE t2.ID IS NULL
; esto restringirá los resultados devueltos solo a aquellas filas donde el ID devuelto de laTable2
es nulo; en otras palabras, NO hay registro en laTable2
para esa ID en particular de laTable1
.Table2.ID
se devolverá como NULL para todos los registros deTable1
donde la ID no coincida enTable2
.
Donde T2
es la tabla a la que está agregando la restricción:
SELECT *
FROM T2
WHERE constrain_field NOT
IN (
SELECT DISTINCT t.constrain_field
FROM T2
INNER JOIN T1 t
USING ( constrain_field )
)
Y borra los resultados.
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]
Vamos a tener 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-
Usando la unión interna
seleccione * de empleado donde id no está en (seleccione e.id de empleado e salario de unión interna s en e.id = s.id)
Usando la unión externa izquierda
seleccione * del empleado e dejó el salario de la combinación externa s en e.id = s.id donde s.id es nulo
Usando Full Join
seleccione * del empleado e salario externo de la combinación completa en e.id = s.id donde e.id no está en (seleccione id del salario)
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.
- La selección inicial enumera los identificadores de la tabla1. estas serán las filas que queremos eliminar.
- 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.
- La instrucción de selección entre paréntesis obtendrá una lista de todos los identificadores que se encuentran en la tabla 2.