Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / cross apply на дерево / 9 сообщений из 9, страница 1 из 1
17.05.2019, 19:54
    #39814786
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cross apply на дерево
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create table a (aid int, parentid int, level int, root int, path sysname)
insert into a (aid, parentid, level, root, path) values (1, 0, 1, 1, '1')
insert into a (aid, parentid, level, root, path) values (2, 1, 2, 1, '1->2')
insert into a (aid, parentid, level, root, path) values (3, 2, 3, 1, '1->2->3')
GO

create table j (jid int, aid int, val float )
insert into j (jid, aid, val) values (44, 1, 5.0)
insert into j (jid, aid, val) values (55, 2, 6.0)
insert into j (jid, aid, val) values (66, 3, 7.0)



Как модифицировать cross apple - или что-то иное надо чтобы получить такой выход?

родитетельскому a добавить все вхождения j от детей.

Код: sql
1.
select a.aid, parentid, level, root, path, jid, val from a cross apply j order by 1 asc



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
aid, parentid, level, root,     path,   jid,    val
1	0	1	1	1	44	5
1	0	1	1	1	55      6
1	0	1	1	1	66	7

2	1	2	1	1->2	55	6
2	1	2	1	1->2	66	7

3	2	3	1	1->2->3	66	7
...
Рейтинг: 0 / 0
17.05.2019, 21:48
    #39814802
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cross apply на дерево
Будет ли единственным такое решение?

Код: sql
1.
2.
3.
4.
SELECT a.aid, parentid, level, root, path, jid, val 
FROM (select a1.aid, a1.parentid, a1.level, a1.root, a1.path from a a1 cross apply a a2 where a1.level <= a2.level) a 
LEFT JOIN j ON a.aid = j.aid
order by 1 asc
...
Рейтинг: 0 / 0
20.05.2019, 10:56
    #39815253
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cross apply на дерево
Lepsik,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
CREATE TABLE #a ( [aid] INT, [aidparent] INT )
INSERT INTO #a
VALUES 
  ( 1, 0 ),
  ( 2, 1 ),
  ( 3, 2 )
;
CREATE TABLE #j ( [jid] INT, [aid] INT, [val] FLOAT )
INSERT INTO #j
VALUES 
  ( 44, 1, 5.0 ),
  ( 55, 2, 6.0 ),
  ( 66, 3, 7.0 )
;
WITH
cte AS (
  SELECT
    [aidroot] = a.[aid],
    a.*
  FROM
    #a a
  UNION ALL
  SELECT
    [aidroot] = cte.[aidroot],
    a.*
  FROM
    cte
    INNER JOIN #a a ON ( a.[aidparent] = cte.[aid] )
)
SELECT
  cte.[aidroot],
  cte.[aid],
  j.[jid],
  j.[val]
FROM
  cte
  LEFT JOIN #j j ON (
        j.[aid] = cte.[aid] )
ORDER BY
  [aidroot],
  [aid]
;
DROP TABLE #a
DROP TABLE #j
;
...
Рейтинг: 0 / 0
20.05.2019, 10:58
    #39815254
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cross apply на дерево
LepsikБудет ли единственным такое решение?

Не только не будет, но еще и не правильным.
...
Рейтинг: 0 / 0
21.05.2019, 03:55
    #39815578
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cross apply на дерево
Почему нет? результат на лицо. Сравнение по root только добавить если другие ветви будут.

Код: sql
1.
2.
3.
4.
SELECT a.aid, parentid, level, root, path, jid, val 
FROM (select a1.aid, a1.parentid, a1.level, a1.root, a1.path from a a1 cross apply a a2 where a1.level <= a2.level  and a1.root=a2.root  ) a 
LEFT JOIN j ON a.aid = j.aid
order by 1 asc
...
Рейтинг: 0 / 0
21.05.2019, 03:58
    #39815579
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cross apply на дерево
у вас output неверный
...
Рейтинг: 0 / 0
21.05.2019, 04:01
    #39815581
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cross apply на дерево
Прошу прошения - я затупил. Был неправ.

Правильно будет:

Код: sql
1.
2.
3.
4.
SELECT a.aid, parentid, level, root, path, jid, val 
FROM (select a1.aid, a1.parentid, a1.level, a1.root, a1.path from a a1 cross apply a a2 where a1.level >= a2.level and a1.root=a2.root ) a 
LEFT JOIN j ON a.aid = j.aid
order by 1 asc
...
Рейтинг: 0 / 0
21.05.2019, 16:25
    #39815907
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cross apply на дерево
LepsikПравильно будет
А теперь усложним пример до "реального"
Код: sql
1.
2.
3.
4.
5.
6.
create table a (aid int, parentid int, level int, root int, path sysname)
insert into a (aid, parentid, level, root, path) values (1, 0, 1, 1, '1')
insert into a (aid, parentid, level, root, path) values (2, 1, 2, 1, '1->2')
insert into a (aid, parentid, level, root, path) values (3, 2, 3, 1, '1->2->3')
insert into a (aid, parentid, level, root, path) values (4, 1, 2, 1, '1->4')
insert into a (aid, parentid, level, root, path) values (5, 4, 3, 1, '1->4->5')


LepsikБыл неправ.
Ты продолжаешь быть не прав.
LepsikПрошу прошения - я затупил.
Я тебя прощаю, а вот SQL - нет.
...
Рейтинг: 0 / 0
21.05.2019, 21:25
    #39816040
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
cross apply на дерево
Ваш output недостоверен

для id = 1 parentid должен быть равен 0.

aid parentid , val
1, 0, 5
1, 0, 6
1, 0, 7

он будет более достоверен, если будет такой.

SELECT cte.[aidroot] AS aid, a.[aidparent] , j.[jid], j.[val] FROM cte LEFT JOIN #j j ON ( j.[aid] = cte.[aid] )
JOIN #a a ON a.aid = cte.[aidroot]
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / cross apply на дерево / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]