sql server 2005 - tablas - Ejemplos de consulta en una relación de muchos a muchos
sql tabla muchos a muchos (4)
1) seleccione tableA. * From tableA join tableA_B en tableA.id = tableA_B.idA donde tableA_B.idB = somevalue
2) seleccione tabla B. * De la tabla B izquierda combine la tabla A_B en la tabla B.id = tablaA_B.idB donde tablaA_B.idA = algún valor
3) la inserción depende de su base de datos, pero inserte en a, inserte en b, y luego inserte en a_b; incluso con restricciones en las tablas debería funcionar de esa manera.
sugerencia: no use el operador IN para 1/2
Wow, es difícil encontrar una explicación simple para este tema. Una relación simple de muchos a muchos.
Tres tablas, tabla A, tabla B y una tabla de unión A_B.
Sé cómo configurar la relación, con las claves y todo, pero me confundo un poco cuando llega el momento de realizar INSERTAR, ACTUALIZAR y ELIMINAR consultas ...
Básicamente, lo que estoy buscando es un ejemplo que muestra:
Cómo obtener todos los registros en TableA, en base a una ID en TableB
Cómo obtener todos los registros en TableB, en base a una ID en TableA
3 Cómo INSERTAR en TableA o TableB, y luego hacer el INSERT apropiado en la tabla de unión para hacer la conexión.
No estoy buscando una solución para un proyecto específico, solo unos pocos ejemplos generales que se pueden aplicar. ¿Tal vez tienes algo por ahí?
Lo primero que haría sería recomendar el uso de un ORM como Linq-To-Sql o NHibernate, que le proporcionará representaciones de objetos de su modelo de datos, lo que simplifica mucho el manejo de cosas complejas como operaciones CRUD de muchos a muchos.
Si un ORM no es parte de su conjunto de herramientas, aquí está cómo se vería en SOL.
Users UserAddresses Addresses ======= ============= ========= Id Id Id FirstName UserId City LastName AddressId State Zip
Nuestras tablas se unen así:
Users.Id -> UserAddresses.UserId Addresses.Id -> UserAddresses.AddressId
- Todos los registros en usuarios basados en Addresses.Id
SELECT Users.* FROM Addresses INNER JOIN UserAddresses ON Addresses.Id = UserAddresses.AddressId INNER JOIN Users ON UserAddresses.UserId = Users.Id WHERE (Addresses.Id = @AddressId)
- Todos los registros en direcciones basadas en Users.Id
SELECT Addresses.* FROM Addresses INNER JOIN UserAddresses ON Addresses.Id = UserAddresses.AddressId INNER JOIN Users ON UserAddresses.UserId = Users.Id WHERE (Users.Id = @UserId)
Para obtener todos los registros en la tabla A en base a la clave en B, en inglés, desea que los registros en la Tabla A que tienen un registro de unión con esa tecla TableB (Suponer que la tabla A_B tenga dos cols de clave externa, (TabAFK y TabBFK)
Select * from TableA A
Where pK In (Select Distinct TabAFK From tableA_B
Where TabBFK = @TableBKeyValue)
Lo mismo para otra dirección
Select * from TableB B
Where pK In (Select Distinct TabBFK From tableA_B
Where TabAFK = @TableAKeyValue)
Para insertar un nuevo registro, realice una inserción normal en TableA y TableB según sea necesario ... Los insertos en la tabla de unión (tabla A_B) son solo los dos pks de las dos tablas principales
Insert TableA (pk, [other columns]) Values(@pkValue, [other data)
Insert TableB (pk, [other columns]) Values(@pkValue, [other data)
- Luego inserta en la tabla Unir para cada asociación que existe ...
Insert tableA_B (TabAFK, TabBFK) Values(@PkFromA, @PkFromB)
SELECT *
FROM a
WHERE id IN (SELECT aid FROM ab WHERE bid = 1234)
o
SELECT a.*
FROM a
JOIN ab ON a.id = ab.aid
WHERE ab.aid = 12345
Para insertar, eso depende de su base de datos (por ejemplo, si las claves primarias provienen de secuencias, generadas automáticamente o generadas de alguna otra manera o simplemente claves compuestas). Pero solo necesitas:
Para esa información:
INSERT INTO a VALUES (...)
Para la relación:
INSERT INTO ab VALUES (...)