【问题标题】:Finding associated records using two references使用两个引用查找关联记录
【发布时间】:2011-08-16 06:04:11
【问题描述】:

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

【问题讨论】:

  • 我不明白你的参考资料。我可以看到 01 与 02 的关系,但看不到 03 或 04。同样,05 与 07 的关系如何?
  • @Hand-E-Food 它正在链接。 Ref2 of 1 -> Ref 1 of 2。Ref 2 of 2 -> Ref 1 of 3...
  • 我认为可能是这种情况,但是在编辑问题之前 02.Ref2 与 03.Ref1 不同。

标签: .net sql ms-access


【解决方案1】:

我不能代表 VB.net 或 C#,但我认为这在直接 SQL 中是不可能的,除非已知最大引用链长度。

我几乎可以看到在 ref1 = ref2 上使用自连接的解决方案,但问题在于递归。递归查询是not supported in access

我链接的问题的其中一个(不接受)答案可能通过 Access 中的 SQL 和 VBA 的组合提供了递归 sql 的解决方案,但我不能代表它。

【讨论】:

  • 存储过程怎么样?可以写一个递归过程吗?
  • Microsoft Access 从一开始就支持递归查询。您可以链接/递归多达 256 个查询。你不能在一个巨大的 SQL 语句中做到这一点。
【解决方案2】:

我相信其他人可以改进这个答案。

我会使用 .Net 代码,因为我就是这样做的。 :-)

伪代码:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多