2016-05-31 7 views
2

Es gibt wahrscheinlich eine einfache Lösung, aber ich bin ratlos.Master/Kind mit alternativen Verknüpfungsfeldern in der Kind-Tabelle

Ich habe eine Master-Tabelle mit einem ID-Feld. Es gibt eine untergeordnete Tabelle mit dieser ID in zwei möglichen Feldern. Stellen Sie sich ein Doppel-Team mit Spieler A und Spieler B vor. Der Master-Tisch hat zwei Datensätze, einen für jeden Spieler. Das Kind hat einen Datensatz mit der Spieler-A-ID in einem Feld und der Spieler-B-ID in einem zweiten Feld.

Wenn ich den Master/Child benutze und ich auf Player A sitze, sehe ich nur die Child-Records, wenn Player A im ersten ID-Feld ist. Wenn ich zu Player B gehe, sehe ich nichts in der Child-Tabelle, wenn Player B ID im zweiten Feld ist.

Irgendwelche Hilfe?

Danke,

Don

Antwort

3

Das Kind wird ein Datensatz mit dem Spieler A-ID in einem Feld und dem Spieler B ID in einem zweiten Feld haben.

In diesem Fall sollten Sie ein fkInternalCalc Feld auf der Detailtabelle betrachten (falls Ihr TDataSet Typ fkInternalCalc Felder unterstützt, und Ableiten seinen Wert im Fall Detail's OnCalcFields passen aber Ihr Datenmodell) und verwenden, die als die Detailfeld in einem Index in der Detail-Tabelle zum Auswählen von Datensätzen, die dem Master entsprechen. Aber im Allgemeinen, das zu tun (dh die Detail-Datensätze auf Werte aus verschiedenen Feldern zu verknüpfen) ist ein Zeichen unvollständiger Datenmodellierung ** - Sie könnten besser eine Zwischenverknüpfungstabelle zwischen den beiden Tabellen haben, die Sie gerade haben haben, z Verknüpfung der Detailaufzeichnungen mit dem Master anhand der PlayerID, unabhängig davon, ob der Player "PlayerA" oder "PlayerB" ist.

** - Der Grund dafür ist, dass der Master, wie Sie offensichtlich festgestellt haben, mit dem Detail auf der Basis von zwei verschiedenen Feldern in der Detail-Tabelle verknüpft werden kann und das nicht in die traditionelle Beziehung zwischen MD-Beziehungen passt Delphi (dh ein einzelnes Feld oder eine Kombination von Feldern ohne Alternativen) und tatsächlich eine zusätzliche "verknüpfende" Tabelle ist die bessere Möglichkeit, die Situation zu modellieren, in der die Verbindung auf der Grundlage der Werte in den Detailfeldern IDFieldA und IDFeldB.

Btw, welche TDataSet-Nachkommen verwenden Sie?

+0

Ich glaube, ich mache, was Sie in Ihrem ersten Vorschlag haben. Master-Tabelle mit einem Index für die playerID. Das Problem scheint zu sein, ich möchte das Kind zeigen, ob die PlayerID aus der Master-Tabelle in der Kind-ID Feld 1 oder Feld 2 ist. – dcboje

+0

"Ich möchte das Kind zeigen, ob die PlayerID" Wenn Sie die Tabellen korrekt verknüpft haben Wie auch immer, Sie sollten das nicht tun müssen. BTW, siehe Updates zu beantworten. – MartynA

+0

Ich hätte die gewünschten Komponenten hinzufügen sollen. Es ist sehr einfach; ein paar tdbgrids, tdatasource und tTables. – dcboje

3

Gday,

Wenn ich lesen Sie aright, möchten Sie jedes Kind Zeile zurückzugeben, die die übergeordnete ID in entweder A oder B.

Um dies zu tun in einer Abfrage hat, könnten Sie schreiben:

select A, field1, field2... from childtable where A = :keyvalue union all select B, field1, field2... from childtable where B = :keyvalue

Hoffe es hilft!

+0

Eigentlich bevorzuge ich Ihre Antwort auf meine, also +1, aber natürlich hängt es von den OP-Datensätzen ab, die SQL unterstützen, was er noch nicht gesagt hat. – MartynA

+0

Aaah! guter Punkt! –

+0

Ich möchte Ihnen allen für die Vorschläge danken. Ich konnte endlich einen "onfilterrecord" korrekt schreiben, um die beiden Felder zu testen, und es tut, was ich brauche. – dcboje

0

Je einfacher und viel schneller laufende Antwort auf die UNION ALL-Join ist

SELECT Mast.* ,DetA.* ,DetB.* FROM 
MAST 
JOIN Det AS DetA ON Mast.AID=DetA.Det_ID 
JOIN Det AS DetB ON Mast.BID=DetB.Det_ID 

Wenn Sie im Spiel eine beliebige Anzahl von Spielern haben zu können, dann wird jeder Det Datensatz (Spieler) muss zeigen an den Master mit der Mast_ID. Sie können einen ähnlichen Join auf diese Weise durchführen, aber Sie erhalten einen Datensatz pro Spieler, wenn Sie dies tun. Die Art, wie ich es oben getan habe, gibt Ihnen einen Datensatz für jede Master/Detail A/Detail B-Kombination.