Заказать запрос на основе поля, указывающего на ту же таблицу - PullRequest
2 голосов
/ 26 августа 2009

У меня есть таблица с именем «Предложение», которая имеет следующие поля:

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

Так что, если бы у меня были следующие записи:

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

Если я знаю, что началом последовательности является запись с ID = 1, есть ли способ заказать запрос на основе последовательности NextID. Как и в примере выше, ожидаемый результат должен быть ...

The quick
brown fox
jumps over
the
lazy dog.

Я ищу либо операторы T-SQL, либо как-то делаю это с Linq. Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 26 августа 2009

попробуйте это:

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 голосов
/ 27 августа 2009

Если вы используете LINQ to SQL / Entities, сгенерированный класс Sentence должен иметь все те свойства, которые вы упомянули, а также ссылку на сущность для следующего предложения (назовем его NextSentence) из внешнего ключа.

Тогда вы можете просто сделать:

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

и sb.ToString() будут иметь ваш ответ.

0 голосов
/ 26 августа 2009

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...