Построение дерева из базы данных

#sql #sql-server #tree

#sql #sql-сервер #дерево

Вопрос:

У меня есть две таблицы. Таблица 1. (tbl_1)

 | ID | Name         |
| -- | -------------|
| 1  |   Company1   |
| -- | -------------|
| 2  |   Company2   |
| -- | -------------|
| 3  |   Company2   |
  

Таблица 2. (tbl_2)

 | ID |  Company_group |
| -- |  ------------- |
| 1  |  Company2      |
| -- |  ------------- |
| 2  |  Company2      |
| -- |  ------------- |
| 3  |  Company2      |
  

Теперь, когда Company_2 является родительской компанией, я хочу получить следующий результат.

 | ID | Name         | RootName  | RootId |
| -- | -------------| --------- | ------ |
| 1  |  Company1    |  Company2 |    2   |
| -- | -------------| ----------|--------|
| 3  |  Company3    | Company2  |    2   |
  

Я не знаю ParentID. Но я могу выбрать все родительские компании с последующим запросом:

 SELECT DISTINCT id parentId,
 name parent_name FROM tbl_1 WHERE name in (
SELECT DISTINCT
Company_group
FROM tbl_2) 
  

Как я могу построить дерево для этой иерархии? Я не могу думать, пожалуйста, помогите.

Это странная архитектура для этого случая, но архитектор базы данных — это не я.

Также я написал запрос, но он работает неправильно. Он возвращает больше записей.

 SELECT ac.id_c parentId, acc.id, ac.Company_group parent_name
FROM tbl_2 ac
JOIN tbl_2 acc
ON ac.Company_group = acc.Company_group
AND ac.id in (
SELECT DISTINCT id parentId
 FROM tbl_1 WHERE name in (
SELECT DISTINCT
id parentId
FROM tbl_2)
)
WHERE ac.Company_group iS NOT NULL AND acc.id IS NOT NULL
and ac.id <> acc.id

ORDER BY ac.Company_group
  

Ответ №1:

 create table tbl_1 (ID int,Name varchar(100));
insert into tbl_1 (ID,Name) values (1,'Company1'),(2,'Company2'),(3,'Company3');

create table tbl_2 (ID int,Company_group varchar(100));
insert into tbl_2 (ID,Company_group) values (1,'Company2'),(2,'Company2'),(3,'Company2');
  

 select      t1.ID
           ,t1.Name
           ,t2.Company_group    as RootName
           ,t1_b.ID             as RootId

from                    tbl_1   t1

            join        tbl_2   t2

            on          t2.ID   =
                        t1.ID

            join        tbl_1   t1_b

            on          t1_b.Name   =
                        t2.Company_group

where       t1.ID <> t1_b.ID
;
  

Комментарии:

1. Спасибо. Ваш запрос также возвращает больше записей, чем я ожидаю. Но результат меньше, чем возвращает в моем последнем запросе.

2. @Сева, добро пожаловать. этот запрос возвращает правильные результаты для вашего примера. Если вы получаете нежелательные результаты в рабочей среде, пожалуйста, измените образец, чтобы он правильно отображал производственные данные.

Ответ №2:

Вам просто нужно объединить таблицу с самой собой:

 SELECT *
FROM Company c1
   LEFT OUTER JOIN Company c2 ON c1.ParnetID = c2.ID
  

Комментарии:

1. Привет. Вы меня не понимаете. У меня нет ParnetID в базе данных. У меня есть только Company_group и это varchar. Посмотрите, как я получаю родительскую компанию.