使用两个引用查找关联记录

时间:2011-08-16 06:04:11

标签: .net sql ms-access

我有一个名为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#。

2 个答案:

答案 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号进行比较。