具有子表中的备用链接字段的主/子

时间:2016-05-31 20:43:07

标签: delphi

这可能是一个简单的解决方案,但我很难过。

我有一个包含一个ID字段的主表。在两个可能的字段中有一个带有该ID的子表。想想有玩家A和玩家B的双打团队。主表将有两个记录,每个玩家一个。 Child将在一个字段中有一个记录,其中Player A ID和第二个字段中的Player B ID。

当我使用Master / Child并且我坐在玩家A上时,如果玩家A在第一个ID字段中,我将只看到子记录。如果我移动到玩家B,那么如果玩家B ID在第二个字段中,我在子表中看不到任何内容。

任何帮助?

谢谢,

3 个答案:

答案 0 :(得分:3)

  

Child将有一条记录,其中一个字段中的玩家A ID和第二个字段中的玩家B ID。

在这种情况下,您应该考虑在Detail表上使用fkInternalCalc字段(如果您的TDataSet类型支持fkInternalCalc字段,并在Detail's OnCalcFields事件中派生它的值但是适合您的数据模型)并将其用作详细信息表上的索引中的详细信息字段,用于选择与主服务器匹配的记录。但一般来说,需要这样做(即,链接来自不同字段的值的详细记录)是不完美的数据建模**的标志 - 你可能最好在你目前的两个表之间有一个中间的“链接”表有,例如,无论玩家是“PlayerA”还是“PlayerB”,都可以在PlayerID的基础上将详细记录链接到Master。

** - 原因在于,正如您明显收集的那样,Master可以根据Detail表中的两个不同字段链接到Detail,这与MD关系传统上在Delphi中的工作方式不相符(即单个字段或没有替代字段的字段组合)实际上额外的“链接”表是更好的方法来建模链接需要根据详细信息字段IDFieldA和IDFieldB中的值定义的情况

顺便问一下,您使用的是什么TDataSet后代类型?

答案 1 :(得分:3)

g·天,

如果我正确地读到你,你想要返回父A在A或B中的每个子行。

要在查询中执行此操作,您可以编写:

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

希望它有所帮助!

答案 2 :(得分:0)

UNION ALL连接的简单且快得多的运行答案是

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

如果你想在游戏中拥有任意数量的玩家,那么每个Det记录(玩家)需要使用Mast_ID指向主人。您可以通过这种方式进行类似的加入,但如果您这样做,您将获得每个玩家一条记录。我上面的方式为每个主/细节A /细节B组合提供了一条记录。