2011-08-16 3 views
0

내가 기록을 테이블이라고하고이 세 개의 열이 포함
찾기 관련된 기록이 참조

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

귀하의 참조를 이해할 수 없습니다. 01이 02와 어떻게 관련이 있는지 알 수 있지만 03이나 04는 볼 수 없습니다. 마찬가지로 05는 07과 어떤 관련이 있습니까? –

+0

@ Hand-E-Food 그것은 체인입니다. Ref2 of 1 -> Ref 1 of 2 2. Ref 2 of 2 -> Ref 1 of 3 ... –

+0

나는 그럴 수도 있다고 생각했지만, 02.Ref2는 달랐다. 질문을 편집하기 전에 03.Ref1. –

답변

0

저는 VB.net이나 C#을 말할 수 없지만, 최대 참조 체인 길이를 알지 못하면 곧바로 SQL에서 가능하다고 생각하지 않습니다.

ref1 = ref2에서 자체 조인을 사용하는 솔루션을 거의 볼 수 있지만 문제는 재귀입니다. 재귀 쿼리는 not supported in access입니다.

내가 링크 된 질문에 대한 대답 (받아 들일 수없는) 중 하나는 Access에서 SQL과 VBA를 조합하여 재귀 적 SQL에 대한 해결책을 제시 할 수 있지만 그 이유는 말할 수 없습니다.

+0

저장된 프로 시저는 어떻습니까? 재귀 프로 시저를 작성할 수 있습니까? –

+0

처음부터 Microsoft Access에서 재귀 쿼리가 지원되었습니다. 최대 256 개의 쿼리를 연결/재귀 할 수 있습니다. 하나의 막대한 SQL 문에서이를 수행 할 수 없습니다. – AMissico

0

다른 사람이이 답변을 개선 할 수있을 것으로 확신합니다.

.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을 자릅니다. 당신은 각 레코드를 기껏해야 두 번받을 것입니다. SQL 쿼리에 OR NOT [ID] IN Results.ID을 추가 할 수는 있지만 많은 ID 번호와 비교할 가치가 있는지 확인하기 위해 성능을 검사하고 있습니다.

관련 문제