GeoFinex Ответов: 2

Код C# для извлечения иерархических данных из таблицы


Привет, я пытаюсь написать код для извлечения данных из таблицы, ссылающихся друг на друга от родителя к потомку (как иерархия)

Предположим, я хочу получить данные ParentId "3", тогда он вернет ChildId "4".

Теперь здесь снова будет запущен цикл для получения ChildId, где ParentId равен "4" , и вернет ChildId "5" и так далее

Конечный результат будет отображаться следующим образом:
3 - 4
4 - 5
5 - ноль

Заранее спасибо за решение моей проблемы.
С уважением

Что я уже пробовал:

create table [dbo].[Table1](ParentId int primary key, ChildId int)

insert into Table1 values (1, 2)
insert into Table1 values (2, 3)
insert into Table1 values (3, 4)
insert into Table1 values (4, 5)
insert into Table1 values (5, NULL)


табличные данные:
Атрибутом parentId   ChildId
1              2
2              3
3              4
4              5
5              НУЛЕВОЙ

String Cid = "1";  //The parent id from where the loop will start
nCon.Open();
SqlCommand gCmd = new SqlCommand("SELECT ParentId, ChildId FROM Table1 WHERE ParentId = @Childid", nCon);
gCmd.Parameters.AddWithValue("@Childid", Cid);

SqlDataAdapter ds = new SqlDataAdapter(gCmd);
DataTable Dt = new DataTable();
ds.Fill(Dt);

for (int i = 0; i < Dt.Rows.Count; i++)
{
    Response.Write(Dt.Rows[i]["ParentId"].ToString() + 
                   Dt.Rows[i]["ChildId"].ToString());

    Cid = Dt.Rows[i]["ChildId"].ToString();
}

F-ES Sitecore

Вам, вероятно, нужно присоединиться к таблице 1 Сама по себе

выбрать поля из table1 п присоединяйтесь к таблице table1 с на C.ChildId = стр. Атрибутом parentId

что-то вроде того

CHill60

Посмотрите на этот пример в моей статье Циклы обработки в SQL Server - обход иерархии[^]

2 Ответов

Рейтинг:
11

Wendelius

Насколько я вижу, вы можете сделать все это в одном рекурсивном запросе. Рассмотрим следующий запрос с использованием предоставленного Вами тестового материала

WITH HQuery (ParentId, ChildId, Relation) AS (
-- anchor query
SELECT  t.ParentId,
        t.ChildId,
		CAST(t.ParentId AS varchar(100)) + ' - ' + CAST(t.ChildId AS varchar(100))
FROM    Table1 t
WHERE   t.ParentId = 3 -- starting point
UNION ALL
-- recursive portion
SELECT  t.ParentId,
        t.ChildId,
		CAST(t.ParentId AS varchar(100)) + ' - ' + COALESCE(CAST(t.ChildId AS varchar(100)), 'NULL')
FROM    Table1 t,
        HQuery hq
WHERE   t.ParentId = hq.ChildId
)
-- using query
SELECT * FROM HQuery

Для получения дополнительной информации взгляните на С common_table_expression (Transact-SQL) | Microsoft Docs[^]


Maciej Los

5ed!

Wendelius

Спасибо!

Рейтинг:
0

MadMyche

То, что вы ищете, называется "рекурсия"; и для этого вам нужно будет пройти через каждый ChildID и запустить один и тот же оператор SQL, снова выполняя тот же оператор, пока вы не получите никаких результатов.

Обычно я делаю это в своем SQL Server, используя хранимую процедуру на основе CTE, чтобы уменьшить сетевую болтовню и слои объектов в вызывающем приложении.
В приложениях электронной коммерции это то, что выводит деревья категорий...
И то, что я делаю для них, - это запускаю эту процедуру из триггера и сохраняю в новой таблице, а затем мне нужно только сделать простой SQL-запрос, чтобы не облагать налогом сервер бесчисленное количество раз, когда покупки заняты


Maciej Los

5ed!