Esempi di query in una relazione molti-a-molti
-
03-07-2019 - |
Domanda
Wow, è difficile trovare una semplice spiegazione a questo argomento. Una semplice relazione molti-a-molti.
Tre tabelle, tableA, tableB e una tabella di giunzione A_B.
So come impostare la relazione, con i tasti e tutto il resto, ma mi confondo un po 'quando arriva il momento di eseguire le query INSERT, UPDATE e DELETE ....
Fondamentalmente, quello che sto cercando è un esempio che mostra:
-
Come ottenere tutti i record in TableA, in base a un ID in TableB
-
Come ottenere tutti i record in TableB, in base a un ID in TableA
3 Come INSERIRE in Tabella A o TabellaB, quindi effettuare INSERTO appropriato nella tabella di giunzione per effettuare la connessione.
Non sto cercando una soluzione per un progetto specifico, solo alcuni esempi generali che possono essere applicati. Forse hai qualcosa in giro?
Soluzione
La prima cosa che vorrei fare è raccomandare di utilizzare un ORM come Linq-To- Sql o NHibernate che ti fornirà rappresentazioni oggettive del tuo modello di dati che lo rendono molto più semplice gestire cose complesse come le operazioni CRUD molte-a-molte.
Se un ORM non fa parte del tuo set di strumenti, ecco come apparirebbe in SOL.
Users UserAddresses Addresses ======= ============= ========= Id Id Id FirstName UserId City LastName AddressId State Zip
Le nostre tabelle sono unite in questo modo:
Users.Id -> UserAddresses.UserId Addresses.Id -> UserAddresses.AddressId
- Tutti i record negli Utenti basati su 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)
- Tutti i record negli indirizzi basati su 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)
Altri suggerimenti
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
Da inserire, dipende dal database (ad es. se le chiavi primarie provengono da sequenze, generate automaticamente o generate in qualche altro modo o semplicemente chiavi composte). Ma hai solo bisogno di:
Per tali dati:
INSERT INTO a VALUES (...)
Per la relazione:
INSERT INTO ab VALUES (...)
Per ottenere tutti i record nella tabella A in base alla chiave in B, in inglese, si desidera i record nella tabella A che hanno un record Join con quella chiave della tabella B (Supponiamo che tableA_B abbia due colonne di chiave esterna, (TabAFK e TabBFK)
Select * from TableA A
Where pK In (Select Distinct TabAFK From tableA_B
Where TabBFK = @TableBKeyValue)
Stessa cosa per l'altra direzione
Select * from TableB B
Where pK In (Select Distinct TabBFK From tableA_B
Where TabAFK = @TableAKeyValue)
Per inserire un nuovo record, esegui un normale inserimento in TableA e TableB secondo necessità ... Gli inserti nella tabella di join (tableA_B) sono solo i due picchi delle due tabelle principali
Insert TableA (pk, [other columns]) Values(@pkValue, [other data)
Insert TableB (pk, [other columns]) Values(@pkValue, [other data)
- Quindi inserire nella tabella Join per ogni associazione esistente ...
Insert tableA_B (TabAFK, TabBFK) Values(@PkFromA, @PkFromB)
1) selezionare tableA. * da tableA unire tableA_B su tableA.id = tableA_B.idA dove tableA_B.idB = somevalue
2) selezionare tableB. * da tableB a sinistra join tableA_B su tableB.id = tableA_B.idB dove tableA_B.idA = somevalue
3) insert dipende dal tuo database, ma inserisci in a, inserisci in b, quindi inserisci in a_b; anche con vincoli sui tavoli dovrebbe funzionare in questo modo.
suggerimento: non utilizzare l'operatore IN per 1/2