我有一个名为records的表,它包含三列:
ID Ref1 Ref2
-- ---- ----
01 abcd efgh
02 efgh ijkl
03 ijkl qrst
04 qrst ""
05 1234 5678
06 5678 9999
07 9999 8888
我想要达到的结果是: 当我选择记录01时,我希望看到所有相关记录。记录通过Ref1和Ref2相关,因此选择记录01的结果将是记录01到04;如果我选择记录02,我仍然应该看到记录01到04;如果我选择记录05那么我会看到记录05到07等。
约束: 我使用access作为数据库,asp .net网页作为'前端'。如果无法使用SQL完成,则可以使用VB.net或C#。
答案 0 :(得分:0)
我不能代表VB.net或C#,但除非知道最大参考链长,否则我不相信这在直接SQL中是可行的。
我几乎可以在ref1 = ref2上看到使用自联接的解决方案,但问题是递归。递归查询是not supported in access。
我链接的问题的一个(未接受的)答案可能通过Access中的SQL和VBA的组合来提供递归sql的解决方案,但我不能代表它。
答案 1 :(得分:0)
我确信其他人可以改进这个答案。
我会使用.Net代码'cos这就是我的工作。 : - )
伪代码:
function GetRelatedRecords(FirstID) as List of Records
Results = new List of Records
SoughtRefs = new List of RefNumbers
UsedRefs = new List of RefNumbers
NewRecords = SELECT * FROM Table WHERE ID = FirstID
loop
for each Record in NewRecords
if Record not in Results then add Record to Results
if Record.Ref1 not in UsedRefs or SoughtRefs then add Record.Ref1 to SoughtRefs
if Record.Ref2 not in UsedRefs or SoughtRefs then add Record.Ref2 to SoughtRefs
next
if SoughtRefs is empty then exit loop
NewRecords = SELECT * FROM Table WHERE Ref1 IN SoughtRefs OR Ref2 IN SoughtRefs
move all SoughtRefs to UsedRefs
end loop
return Results
end function
基本上,获取每条记录的引用号并搜索之前未搜索过的引用号。通过排除使用的引用号,它减少了SQL一遍又一遍地返回冗余记录。你最多可以获得两次记录。您可以将OR NOT [ID] IN Results.ID
添加到SQL查询中,但我会检查性能,看看是否值得与这么多ID号进行比较。