powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / cross apply на дерево
9 сообщений из 9, страница 1 из 1
cross apply на дерево
    #39814786
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
cross apply на дерево
    #39814802
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Будет ли единственным такое решение?

Код: 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
cross apply на дерево
    #39815253
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
cross apply на дерево
    #39815254
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LepsikБудет ли единственным такое решение?

Не только не будет, но еще и не правильным.
...
Рейтинг: 0 / 0
cross apply на дерево
    #39815578
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему нет? результат на лицо. Сравнение по 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
cross apply на дерево
    #39815579
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у вас output неверный
...
Рейтинг: 0 / 0
cross apply на дерево
    #39815581
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прошения - я затупил. Был неправ.

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

Код: 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
cross apply на дерево
    #39815907
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
cross apply на дерево
    #39816040
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваш 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
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / cross apply на дерево
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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