2009-01-06 26 views
10

Guau, es difícil encontrar una explicación simple para este tema. Una relación simple de muchos a muchos.Ejemplos de consultas en una relación muchos a muchos

Tres tablas, tableA, tableB y una tabla de unión A_B.

sé cómo configurar la relación, con las llaves y todo, pero me siento un poco confundido cuando llega el momento de realizar INSERT, UPDATE y DELETE ....

Básicamente, lo que estoy buscando es un ejemplo que muestra:

  1. ¿Cómo conseguir todos los registros en la Tabla a, en base a una identificación en la Tabla B.

  2. ¿Cómo obtener todos los registros en la Tabla B, basado en una identificación de la TablaA

3 cómo insertar en cualquiera TableA o TableB, y luego hacer el INSERT apropiado en la tabla de unión para hacer la conexión ..

No estoy en busca de una solución a un proyecto específico, sólo una algunos ejemplos generales que se pueden aplicar. ¿Tal vez tienes algo por ahí?

Respuesta

6

La primera cosa que me gustaría hacer es recomendar el uso de un ORM como Linq-To-Sql o NHibernate que le dará las representaciones de objeto de su modelo de datos que hacen que sea mucho más simple para manejar cosas complejas como muchas de las operaciones CRUD.

Si un ORM no forma parte de su conjunto de herramientas, aquí se muestra cómo se vería en SOL.

 
Users  UserAddresses  Addresses 
=======  =============  ========= 
Id   Id    Id 
FirstName UserId   City 
LastName AddressId   State 
           Zip 

Nuestras tablas se unen de esta manera:

 
    Users.Id -> UserAddresses.UserId 
    Addresses.Id -> UserAddresses.AddressId 
  • Todos los registros de usuarios en función de 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 de direcciones basados ​​en usuarios .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) 
+0

Esto resolvió mi problema con la selección, pero me cuesta un poco actualizar la tabla de unión. ¿Cuál es la forma más inteligente de hacer esto? Tendría que establecer la cláusula WHERE para el ID de usuario y el Addressid existentes, ¿verdad? Lo he intentado con tablas temporales, pero parece que no puedo obtener la sintaxis correcta. – Soeren

+0

Sí. Es necesario establecer la cláusula se forma a que tanto el ID de usuario existente y AddressID – Micah

+0

@Micah ¿Y si escribo la primera consulta como la siguiente:. SELECT * Los usuarios de los usuarios INNER JOIN UserAddresses EN Users.Id = UserAddresses.UsersID INTERIOR ÚNASE Direcciones ON UserAddresses.AddressId = Addresses.Id WHERE (Addresses.Id = @AddressId) ' ¿Va a estar bien y qué se devolverá? – Nuke

1
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, que depende de su base de datos (por ejemplo, si las claves primarias son a partir de secuencias, auto-generado o generada de alguna otra manera o teclas simplemente compuesto). Pero sólo tiene:

Para que los datos:

INSERT INTO a VALUES (...) 

Para la relación:.

INSERT INTO ab VALUES (...) 
+0

Ok, por lo que es posible hacer esto con o sin combinaciones? En el segundo ejemplo (con la combinación), es necesario escribir "SELECCIONAR a. *" – Soeren

+0

seleccionar donde in() es generalmente más lento que seleccionar donde existe() seleccionar * de a donde existe (seleccionar * de b donde a.Id = b.aId y b.Id = 1234) –

0

1) seleccione tablaA * desde tablaA unirse a tableA_B en tableA.id = tableA_B.idA donde tableA_B.idB = algún valor

2) seleccione tableB. * From tableB left join tableA_B en tableB.id = tableA_B .idB donde tableA_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.

pista: no utilice en el operador para el medio

1

para obtener todos los registros de la tabla A basado en clave en B, en Inglés, desea que los registros de la tabla A que tienen un registro Unirse con ese TableB clave (Suponga tableA_B tiene dos cols clave Exteriores, (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, hacer un inserto de lo normal en la Tabla a y la Tabla B como sea necesario ... se inserta en el j oin mesa (tableA_B) son sólo las 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) 

- A continuación, insertar en tabla de unión para cada asociación que existe ...

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