Pregunta

SQL Server 2005.

Estoy agregando restricciones de clave externa a la base de datos de una aplicación que supuestamente no las necesitaba. Naturalmente, los datos se han vuelto poco confiables y hay entradas huérfanas en el campo de clave externa.

Configuración:
Dos tablas, TableUser y TableOrder. TableUser tiene la clave principal 'UserID' y TableOrder tiene la clave externa 'UserID'.

¿Cómo encuentro las filas donde TableOrder.UserID no tiene una entrada coincidente en TableUser.UserID?

Por ejemplo, TableOrder.UserID tiene un valor de 250, pero no hay una clave TableUser.UserID coincidente para 250.

¿Fue útil?

Solución

Aquí hay una forma:

select * from TableOrder where UserID not in (select UserID from TableUser);

Hay muchas formas diferentes de escribir este tipo de consulta.

Otros consejos

El otro enfoque común es una unión exterior izquierda:

SELECT * FROM TableOrder o
LEFT OUTER JOIN TableUser u ON o.UserID = u.UserID
WHERE u.UserID is NULL

Esta consulta también puede ser útil sin la cláusula where, para examinar y ver los valores correspondientes (si existen), y ver cuáles no coinciden.

No había restricciones FK en las tablas para empezar. Se utilizaron como FK y PK pero no codificados; se creía que eran gastos generales innecesarios. Entonces tenemos todas las columnas, pero no hay restricciones codificadas. Cuando fui a colocarlos para que se hicieran cumplir, descubrí que había muchas violaciones.

Su pregunta resalta el problema. No son gastos indirectos innecesarios, evitan que las personas tengan una confusión general de la base de datos.

Tanto las respuestas de Greg como las de Brad me ayudaron.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top