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