Поиск связанных записей с использованием двух ссылок - PullRequest
0 голосов
/ 16 августа 2011

У меня есть таблица с именем 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 и т. д.

Ограничения: я использую доступ в качестве базы данных и веб-страницы asp .net в качестве «внешнего интерфейса».Если это невозможно сделать с помощью SQL, тогда можно использовать VB.net или C #.

Ответы [ 2 ]

0 голосов
/ 17 августа 2011

Я уверен, что кто-то еще может улучшить этот ответ.

Я бы использовал .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, но я бы проверил производительность, чтобы увидеть, стоит ли сравнивать с таким количеством идентификационных номеров.

0 голосов
/ 16 августа 2011

Я не могу говорить за VB.net или C #, но я не верю, что это возможно в прямом SQL, если не известна максимальная длина ссылочной цепочки.

Я почти вижу решение, использующееСамосоединение на ref1 = ref2, но проблема в рекурсии.Рекурсивные запросы не поддерживаются в доступе .

Один из (не принятых) ответов на вопрос, который я связал, может иметь решение для рекурсивного SQL через комбинацию SQL и VBA в Access,но я не могу говорить за это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...