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:

  1. Wie alle Datensätze in TableA erhalten, basierend auf einer ID in TableB

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

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top