2009-08-26 2 views
2

나는 다음과 같은 필드가 "문장"라는 테이블이 있습니다주문 같은 테이블에 필드 가리키는 기반으로 쿼리

*ID*   *NextID*   *Text* 
1    12    The quick 
3    40    jumps over 
5    null    lazy dog. 
12    3     brown fox 
40    5     the 
: 그래서

ID   <--- OK 
NextID  <--- FK To ID 
Text 

을 나는 다음과 같은 기록이 있다면

시퀀스의 시작이 ID = 1 인 레코드라는 것을 알고 있다면 NextID 시퀀스를 기반으로 쿼리를 정렬 할 수있는 방법이 있습니까? 위의 예에서와 같이, 예상되는 결과는

The quick 
brown fox 
jumps over 
the 
lazy dog. 

가 나는 T-SQL 문/s의 중 하나를 찾고 또는 어떻게 든 Linq를 사용하여이 작업을 수행하고 ...해야한다. 미리 감사드립니다!

+0

SQL 연결 목록 ... 흥미 롭습니다! – Joel

+0

오라클을 사용하는 모든 사람이 똑같은 일을하고 싶어하는 경우, 오라클이 "Connect By"절을 사용하여 매우 간단하게 해결할 수있을뿐만 아니라 더 복잡한 트리 구조로도 작업 할 수 있습니다. –

답변

3

이 시도 :

declare @YourTable table (RowID int primary key, NextID int, TextValue varchar(50)) 

INSERT INTO @YourTable VALUES (1 , 12 ,'The quick') 
INSERT INTO @YourTable VALUES (3 , 40 ,'jumps over') 
INSERT INTO @YourTable VALUES (5 , null,'lazy dog.') 
INSERT INTO @YourTable VALUES (12, 3 ,'brown fox') 
INSERT INTO @YourTable VALUES (40, 5 ,'the') 

;with cteview as (
SELECT * FROM @YourTable WHERE RowID=1 
UNION ALL 
SELECT y.* FROM @YourTable y 
    INNER JOIN cteview c ON y.RowID=c.NextID 
) 
select * from cteview 
OPTION (MAXRECURSION 9999) --go beyond default 100 levels of recursion to 9999 levels 

출력 :

RowID  NextID  TextValue 
----------- ----------- -------------------------------------------------- 
1   12   The quick 
12   3   brown fox 
3   40   jumps over 
40   5   the 
5   NULL  lazy dog. 

(5 row(s) affected) 
+0

최대 100 개의 재귀를 처리 할 수 ​​있으며 재귀 수준을 높일 수 있도록 SQL Server를 구성해야합니다. –

+0

cueview_에서 _select * 뒤에 _OPTION (MAXRECURSION n) _을 추가하면 n은 0에서 32,767 사이의 재귀 수준 (0은 제한 없음)이 될 수 있습니다. –

+0

이 모양은 예쁘습니다. 청초한, 그러나 나는 이것을 LINQ 계산서로 번역 할 수 있는지 궁금하게 생각하고 있었다. – Jaime

0

LINQ 답변 :

table.OrderBy(sentence => sentence.NextID); 

편집 :

class Sentence 
{ 
    public int Id; 
    public int? NextId; 
    public string Text; 
    public Sentence(int id, int? nextId, string text) 
    { 
     this.Id = id; 
     this.NextId = nextId; 
     this.Text = text; 
    } 
} 

var Sentences = new [] { 
    new Sentence(1, 12, "This quick"), 
    new Sentence(3, 40, "jumps over"), 
    new Sentence(5, null, "lazy dog."), 
    new Sentence(12, 3, "brown fox"), 
    new Sentence(40, 5, "the"), 
}; 

Func<int?, string> GenerateSentence = null; 
GenerateSentence = (id) => id.HasValue? Sentences 
    .Where(s => s.Id == id.Value) 
    .Select(s => s.Text + " " + GenerateSentence(s.NextId)) 
    .Single() : string.Empty; 

Console.WriteLine(GenerateSentence(1)); 
: 내가 올바르게 시간을 대답 희망
+2

이 결과가 아닐까요? 게으른 개. 갈색 여우 빠른 가 넘기 ???? – Jaime

+0

네 말이 맞아, 나는 그 질문을 잘못 읽었다. –

+0

순환 연결 목록이 아닌 한이 기능이 작동합니다. –

0

LINQ to SQL/Entities를 사용하는 경우 생성 된 Sentence 클래스는 언급 한 모든 속성과 외래 키에서 다음 문장 (다음 문장으로 보자)에 대한 엔티티 참조가 있어야합니다.

은 그럼 당신은 다만 할 수 있습니다

Sentence s = Sentences.First(); 
StringBuilder sb = new StringBuilder(); 
do { sb.Append(s.Text); s = s.NextSentence; } while (s != null); 

sb.ToString()가 답을해야합니다.

관련 문제