Pregunta

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 claves y todo, pero me confundo un poco cuando llega el momento de realizar consultas de INSERTAR, ACTUALIZAR y BORRAR ...

Básicamente, lo que busco es un ejemplo que muestre:

  1. Cómo obtener todos los registros en la Tabla A, en función de una ID en la TablaB

  2. Cómo obtener todos los registros en TableB, según un ID en TableA

3 Cómo INSERTAR en TableA o TableB, y luego hacer el INSERT adecuado en la tabla de conexiones para hacer la conexión ..

No estoy buscando una solución para un proyecto específico, solo algunos ejemplos generales que se pueden aplicar. Tal vez tienes algo por ahí?

¿Fue útil?

Solución

Lo primero que haría es recomendar el uso de un ORM como Linq-To- Sql o NHibernate que le proporcionará representaciones objetivas de su modelo de datos que lo hacen mucho más fácil de manejar 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 están unidas de esta manera:

   Users.Id -> UserAddresses.UserId
   Addresses.Id -> UserAddresses.AddressId
  • Todos los registros en Usuarios basados ??en Direcciones.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)

Otros consejos

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 son de secuencias, generadas automáticamente o generadas de alguna otra manera o simplemente claves compuestas). Pero solo necesitas:

Para esos datos:

INSERT INTO a VALUES (...)

Para la relación:

INSERT INTO ab VALUES (...)

Para obtener todos los registros en la tabla A en función de la clave en B, en inglés, desea que los registros en la tabla A que tienen un registro de unión con esa clave TableB (Supongamos que la tablaA_B tiene dos columnas 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 ... Las inserciones en la tabla de unión (tableA_B) son solo las dos partes de las dos tablas principales

   Insert TableA (pk, [other columns]) Values(@pkValue,  [other data)
   Insert TableB (pk, [other columns]) Values(@pkValue,  [other data)

- Luego insértelo en la tabla de unión para cada asociación que exista ...

  Insert tableA_B (TabAFK, TabBFK)  Values(@PkFromA,  @PkFromB)  

1) seleccione tableA. * de tableA join tableA_B en tableA.id = tableA_B.idA donde tableA_B.idB = somevalue

2) seleccione tableB. * de tableB left join tableA_B en tableB.id = tableA_B.idB donde tableA_B.idA = somevalue

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 uses el operador IN para 1/2

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