2016-10-20 5 views
1

У меня есть две таблицы. Таблица 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 
; 
+0

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

+0

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

0

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

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

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

Смежные вопросы