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:

  1. Come ottenere tutti i record in TableA, in base a un ID in TableB

  2. 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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top