Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Какой самый простой способ построить дерево ?  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 2018
Вроде стандартная ситуация, на примере 2х таблиц из стран и городов.

ID Description
1  Россия
2  Беларусь

ID OwnerID Description
1  1       Москва
2  1       Санкт-Петербург
3  2       Минск
4  1       Владивосток
5  2       Витебск

Какой самый простой способ создать дерево из 3х колонок ?
 ID, OwnerID, Description
26 сен 17, 12:44    [20823484]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Valery_B,

тут наверное какой-то тайный смысл в впоросе...
26 сен 17, 12:45    [20823486]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 2018
TaPaK,

Нет...
26 сен 17, 12:50    [20823505]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
komrad
Member

Откуда:
Сообщений: 5244
Valery_B
TaPaK,

Нет...


дай угадаю...

+ так?
with 
country as 
(select 1 [ID], 'Russia' [Description] union all
select 2 [ID], 'Belarus' [Description]
)
,
cities as 
(
select 1 [ID], 1 [COUNTRY_ID], 'Moscow' [Description] union all 
select 2 [ID], 1 [COUNTRY_ID], 'St.Petersburg' [Description] union all 
select 3 [ID], 2 [COUNTRY_ID], 'Minsk' [Description] union all 
select 4 [ID], 1 [COUNTRY_ID], 'Vladivostok' [Description] union all 
select 5 [ID], 2 [COUNTRY_ID], 'Vitebsk' [Description]
)
select 
	c.ID
	,c.[Description] [Country]
	,cs.[Description] [City]
from country c
join cities cs on c.ID=cs.COUNTRY_ID
26 сен 17, 12:53    [20823522]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 2018
komrad,

Нет, деревом тут и не пахнет.
26 сен 17, 12:57    [20823549]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
komrad
Member

Откуда:
Сообщений: 5244
Valery_B
komrad,

Нет, деревом тут и не пахнет.


так им не пахло и в постановке задачи ;)
может автору не дерево нужно, а куст...
26 сен 17, 13:02    [20823570]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 2018
Должна получиться такая таблица на выходе:
ID OwnerID Description
1  NULL     Россия  
2  1        Москва
3  1        Санкт-Петербург
4  NULL     Беларусь
5  4        Минск
6  1        Владивосток
7  4        Витебск

Или такая
ID OwnerID Description
1  NULL     Россия  
2  1        Москва
3  1        Санкт-Петербург
4  1        Владивосток
5  NULL     Беларусь
6  5        Минск
7  5        Витебск
26 сен 17, 13:03    [20823577]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Valery_B,

лес прям....

UNION ALL
26 сен 17, 13:12    [20823613]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 2018
TaPaK,

Точно не Юнион.
У Москвы и России будет одинаковый ИД=1
26 сен 17, 13:30    [20823678]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Valery_B
TaPaK,

Точно не Юнион.
У Москвы и России будет одинаковый ИД=1

журнал деградант выпуск 2

;with 
country as 
(select 1 [ID], 'Russia' [Description] union all
select 5 [ID], 'Belarus' [Description]
)
,
cities as 
(
select 1 [ID], 1 [COUNTRY_ID], 'Moscow' [Description] union all 
select 2 [ID], 1 [COUNTRY_ID], 'St.Petersburg' [Description] union all 
select 3 [ID], 5 [COUNTRY_ID], 'Minsk' [Description] union all 
select 4 [ID], 1 [COUNTRY_ID], 'Vladivostok' [Description] union all 
select 5 [ID], 5 [COUNTRY_ID], 'Vitebsk' [Description]
), groups as 
(
	SELECT 
		c.Id,
		[OwnerId] = c.Id,
		c.Description
	FROM country c
	UNION ALL 
	SELECT 
		c.Id,
		c.COUNTRY_ID,
		c.Description
	FROM cities c
), bred as 
(
	SELECT 
		[Id] = ROW_NUMBER() OVER (ORDER BY OwnerId) ,
		[OriginId] = Id,
		OwnerId,
		Description
	FROM groups
)
SELECT 
	a.Id,
	[OwnerId] = b.Id,
	a.Description
FROM 
	bred	a	
LEFT JOIN 
	bred	b
ON
	a.OwnerId IS NOT NULL	AND
	b.OwnerId = b.Id	AND
	b.OriginId= a.OwnerId
	
26 сен 17, 13:59    [20823817]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
TaPaK,

Я всегда знал, что Витебск - корень Беларуси :)

А вообще главный вопрос - "нахрена?". Есть две разные сущности - страны и города, нафига их искуственно смешивать в дерево?
26 сен 17, 14:04    [20823829]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Шыфл,

автор
А вообще главный вопрос - "нахрена?". Есть две разные сущности - страны и города, нафига их искуственно смешивать в дерево?

в нашем журнале таких вопросов не задают
26 сен 17, 14:09    [20823858]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
KRS544
Member

Откуда:
Сообщений: 497
А так не пойдет?
select -OwnerID as ID, OwnerID ,....
union all
....
26 сен 17, 14:11    [20823865]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
KRS544
А так не пойдет?
select -OwnerID as ID, OwnerID ,....
union all
....

конечно пойдёт, вас в титры записывать?
26 сен 17, 14:14    [20823879]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
KRS544
Member

Откуда:
Сообщений: 497
TaPaK, да чушь написал

Вот так
select -ID as ID, NULL /*или -ID*/ as OwnerID, .. from Страна
 union all
select ID, -OwnerID as OwnerID, .. from Город
26 сен 17, 14:22    [20823907]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
KRS544,

главное что бы предыдущие заполнители градов и республик в минуса не лазили да?
26 сен 17, 14:25    [20823927]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
KRS544
Member

Откуда:
Сообщений: 497
TaPaK, типа того
Зато самый простой способ, как просили :)
26 сен 17, 14:28    [20823946]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
KRS544
TaPaK, типа того
Зато самый простой способ, как просили :)

самый быстрый способ это не страдать денормализацией
26 сен 17, 14:31    [20823957]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
komrad
Member

Откуда:
Сообщений: 5244
Valery_B,

+ тогда так?
with 
country as 
(select 1 [ID], 'Russia' [Description] union all
select 2 [ID], 'Belarus' [Description]
)
,
cities as 
(
select 1 [ID], 1 [COUNTRY_ID], 'Moscow' [Description] union all 
select 2 [ID], 1 [COUNTRY_ID], 'St.Petersburg' [Description] union all 
select 3 [ID], 2 [COUNTRY_ID], 'Minsk' [Description] union all 
select 4 [ID], 1 [COUNTRY_ID], 'Vladivostok' [Description] union all 
select 5 [ID], 2 [COUNTRY_ID], 'Vitebsk' [Description]
)
, data as
(
select NULL [Parent], ID, [Description] [Val] from country
union all 
select [ID],[COUNTRY_ID],[Description] [Val] from cities 
)
select 
	ROW_NUMBER() over (order by d1.ID, d1.Parent) [ID]
	,d1.Parent [OwnerID]
	,d1.Val [Description]
from data d1
join data d2 on d1.ID=d2.Parent 
order by d1.ID, d1.Parent
26 сен 17, 14:31    [20823959]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
komrad
Member

Откуда:
Сообщений: 5244
komrad
Valery_B,

+ тогда так?
with 
country as 
(select 1 [ID], 'Russia' [Description] union all
select 2 [ID], 'Belarus' [Description]
)
,
cities as 
(
select 1 [ID], 1 [COUNTRY_ID], 'Moscow' [Description] union all 
select 2 [ID], 1 [COUNTRY_ID], 'St.Petersburg' [Description] union all 
select 3 [ID], 2 [COUNTRY_ID], 'Minsk' [Description] union all 
select 4 [ID], 1 [COUNTRY_ID], 'Vladivostok' [Description] union all 
select 5 [ID], 2 [COUNTRY_ID], 'Vitebsk' [Description]
)
, data as
(
select NULL [Parent], ID, [Description] [Val] from country
union all 
select [ID],[COUNTRY_ID],[Description] [Val] from cities 
)
select 
	ROW_NUMBER() over (order by d1.ID, d1.Parent) [ID]
	,d1.Parent [OwnerID]
	,d1.Val [Description]
from data d1
join data d2 on d1.ID=d2.Parent 
order by d1.ID, d1.Parent


и последняя строка с order by лишняя, кстати...
26 сен 17, 14:33    [20823969]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
komrad,

select 6 [ID], 'Крокожия' [Description]
26 сен 17, 14:34    [20823976]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
komrad лучше б я не выполнял ваш запрос :)
26 сен 17, 14:41    [20824006]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
komrad
Member

Откуда:
Сообщений: 5244
TaPaK
komrad,

select 6 [ID], 'Крокожия' [Description]

нет такой страны
но если даже есть, то


меняем этот фрагмент
from data d1
join data d2


на

from data d1
LEFT join data d2
26 сен 17, 14:41    [20824010]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
komrad
Member

Откуда:
Сообщений: 5244
TaPaK
komrad лучше б я не выполнял ваш запрос :)

разрешаю, не выполняйте! :)
26 сен 17, 14:42    [20824016]     Ответить | Цитировать Сообщить модератору
 Re: Какой самый простой способ построить дерево ?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
komrad,

всё веселее и веселее

автор
нет такой страны
но если даже есть, то

речь про запись страны без городов, мы ж ведь не георграфию тут учим, что бы у всех всё было :)
26 сен 17, 14:43    [20824021]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить