Как загрузить данные из SQL в таблицу дат, которые отображаются в виде дерева - PullRequest
0 голосов
/ 02 января 2019

У меня есть chartTable с 2 столбцами:

ChildPersonID | ParentPersonID
--------------+-----------------
 1            | 2
 1            | 3
 2            | 4

То, что объединено с personTable двумя столбцами:

ID | PersonName
---+-----------------
1  | a
2  | b
3  | c
4  | d

Я хочу выбрать запрос, который заполняет данные с PersonName, который отображается в виде дерева

Результат:

parentname | parentid | childname | childid
-----------+----------+-----------+---------
a          |    1     | b         |    2
a          |    1     | c         |    3
b          |    2     | d         |    4

мой код

DECLARE @Table1 TABLE (ChildPersonID  INT,ParentPersonID INT)
DECLARE @Table2 TABLE (ID INT, PersonName VARCHAR(10))
INSERT INTO @Table1 VALUES (1,2),(1,3),(2,4)
INSERT INTO @Table2 VALUES (1,'a'),(2,'b'),(3,'c'),(4,'d')

SELECT T3.PersonName AS parentName, T1.ChildPersonID AS ParentId,
       T2.PersonName AS childname, T1.ParentPersonID AS childid
FROM @Table1 T1 
INNER JOIN @Table2 T2 ON T1.ParentPersonID = T2.Id 
INNER JOIN @Table2 T3 ON T2.ChildPersonID = T3.id

Ответы [ 2 ]

0 голосов
/ 02 января 2019

См. Код ниже:

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication94
{
    class Program
    {
        static void Main(string[] args)
        {

            DataTable dt = new DataTable();
            dt.Columns.Add("parentname", typeof(string));
            dt.Columns.Add("parentid", typeof(int));
            dt.Columns.Add("childname", typeof(string));
            dt.Columns.Add("childid", typeof(int));

            DataTable dtChildPerson = new DataTable();
            dtChildPerson.Columns.Add("ChildPersonID", typeof(int));
            dtChildPerson.Columns.Add("ParentPersonID", typeof(int));
            dtChildPerson.Rows.Add(new object[] { 1, 1 });
            dtChildPerson.Rows.Add(new object[] { 1, 3 });
            dtChildPerson.Rows.Add(new object[] { 2, 4 });

            DataTable personName = new DataTable();
            personName.Columns.Add("ID", typeof(int));
            personName.Columns.Add("PersonName", typeof(string));
            personName.Rows.Add(new object[] { 1, "a" });
            personName.Rows.Add(new object[] { 2, "b" });
            personName.Rows.Add(new object[] { 3, "c" });
            personName.Rows.Add(new object[] { 4, "d" });


            foreach (DataRow row in dtChildPerson.AsEnumerable())
            {
                int parentID = row.Field<int>("ParentPersonID");
                string parentName = personName.AsEnumerable().Where(x => x.Field<int>("ID") == parentID).Select(x => x.Field<string>("PersonName")).FirstOrDefault();
                int childID = row.Field<int>("ChildPersonID");

                foreach(DataRow childRow in personName.AsEnumerable().Where(x => x.Field<int>("ID") == childID))
                {
                    string childName = childRow.Field<string>("PersonName");

                    dt.Rows.Add(new object[] { parentName, parentID, childName, childID });
                }

            }
        }
    }
}
0 голосов
/ 02 января 2019

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

DECLARE @Table1 TABLE (ChildPersonID  INT,ParentPersonID INT)
DECLARE @Table2 TABLE (ID INT, PersonName VARCHAR(10))

INSERT INTO @Table1 VALUES (1,2),(1,3),(2,4)
INSERT INTO @Table2 VALUES (1,'a'),(2,'b'),(3,'c'),(4,'d')


    SELECT T3.PersonName AS parentName, T1.ChildPersonID AS ParentId,
           T2.PersonName AS childname, T1.ParentPersonID AS childid
    FROM @Table1 T1 
    INNER JOIN @Table2 T2 ON T1.ParentPersonID = T2.Id 
    INNER JOIN @Table2 T3 ON T1.ChildPersonID = T3.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...