这可能是一个简单的解决方案,但我很难过。
我有一个包含一个ID字段的主表。在两个可能的字段中有一个带有该ID的子表。想想有玩家A和玩家B的双打团队。主表将有两个记录,每个玩家一个。 Child将在一个字段中有一个记录,其中Player A ID和第二个字段中的Player B ID。
当我使用Master / Child并且我坐在玩家A上时,如果玩家A在第一个ID字段中,我将只看到子记录。如果我移动到玩家B,那么如果玩家B ID在第二个字段中,我在子表中看不到任何内容。
任何帮助?
谢谢,
唐
答案 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组合提供了一条记录。