Abfragebeispiele in einer many-to-many-Beziehung
-
03-07-2019 - |
Frage
Wow, es ist schwer, eine einfache Erklärung zu diesem Thema zu finden. Eine einfache many-to-many-Beziehung.
Drei Tische, tableA, tableB und eine Kreuzung tableA_B.
Ich weiß, wie die Beziehung einzurichten, mit Schlüssel und alle, aber ich habe ein wenig verwirrt, wenn die Zeit kommt Abfragen INSERT, UPDATE und DELETE auszuführen ....
Im Grunde, was ich suche ist ein Beispiel, das zeigt:
-
Wie alle Datensätze in TableA erhalten, basierend auf einer ID in TableB
-
Wie alle Datensätze in Tabelle B erhalten, basierend auf einer ID in TableA
3 Wie in entweder TableA oder TableB, INSERT und dann die entsprechende INSERT in der Verknüpfungstabelle macht um die Verbindung herzustellen ..
Ich bin nicht auf der Suche nach einer Lösung für ein bestimmtes Projekt, nur wenige allgemeine Beispiele, die angewendet werden können. Vielleicht haben Sie etwas herumliegen?
Lösung
Das erste, was ich tun würde, wird empfehlen eine ORM wie Linq-To- sql oder NHibernate denen geben Ihnen Darstellungen Ihrer Daten-Modell-Objekt, die es viel einfacher, komplexe Dinge wie viele-zu-viele CRUD-Operationen zu behandeln.
Wenn ein ORM nicht Teil des Werkzeugs dann hier eingestellt ist, wie dies in SOL aussehen würde.
Users UserAddresses Addresses ======= ============= ========= Id Id Id FirstName UserId City LastName AddressId State Zip
Unsere Tabellen verbunden sind, wie folgt:
Users.Id -> UserAddresses.UserId Addresses.Id -> UserAddresses.AddressId
- Alle Datensätze in Benutzer basierend auf 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)
- Alle Einträge in Adressen basierend auf 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)
Andere Tipps
SELECT *
FROM a
WHERE id IN (SELECT aid FROM ab WHERE bid = 1234)
oder
SELECT a.*
FROM a
JOIN ab ON a.id = ab.aid
WHERE ab.aid = 12345
einzufügen, dass auf Ihrer Datenbank abhängt (zB ob die Primärschlüssel sind aus Sequenzen, automatisch generiert oder auf andere Art und Weise oder einfach zusammengesetzte Schlüssel generiert). Aber Sie brauchen nur:
Für diese Daten:
INSERT INTO a VALUES (...)
Für die Beziehung:
INSERT INTO ab VALUES (...)
Um alle Datensätze in Tabelle A zu erhalten basierend auf Schlüssel in B, in Englisch, möchten Sie die Datensätze in Tabelle A, die eine Join-Datensatz mit diesem TableB Schlüssel (Angenommen tableA_B hat zwei Fremdschlüssel cols (TabAFK und TabBFK)
Select * from TableA A
Where pK In (Select Distinct TabAFK From tableA_B
Where TabBFK = @TableBKeyValue)
Das Gleiche gilt für andere Richtung
Select * from TableB B
Where pK In (Select Distinct TabBFK From tableA_B
Where TabAFK = @TableAKeyValue)
Um einen neuen Datensatz einzufügen, gehen Sie einen normalen Einsatz in TableA und TableB wie nötig ... Einsätze in der Join-Tabelle (tableA_B) sind nur die beiden pks von den beiden Haupt Tabellen
Insert TableA (pk, [other columns]) Values(@pkValue, [other data)
Insert TableB (pk, [other columns]) Values(@pkValue, [other data)
- Dann in Tabelle einfügen Join für jeden Verein, der existiert ...
Insert tableA_B (TabAFK, TabBFK) Values(@PkFromA, @PkFromB)
1) wählen tableA. * von tableA beitreten tableA_B auf tableA.id = tableA_B.idA wo tableA_B.idB = somevalue
2) wählen tableB. * von tableB links tableA_B kommen auf tableB.id = tableA_B.idB wo tableA_B.idA = somevalue
3) Einsatz ist abhängig von Ihrer Datenbank, sondern legen Sie in ein, legen Sie in b, und fügen Sie anschließend in A_B; auch mit Einschränkungen auf den Tischen sollte es so.
Hinweis: nicht für 1/2 IN-Operator