powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите отсортировать выборку!
9 сообщений из 9, страница 1 из 1
Помогите отсортировать выборку!
    #39915060
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, помогите с вроде бы простой задачей, туплю уже целый день:
Есть некая древовидная структура. Не иерархия - просто несколько таблиц, связанных 1-ко-многим:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
Declare @a table (a_id int, a int)
Declare @b table (b_id int, a_id int, b int)
Declare @c table (c_id int, a_id int, c int)
Declare @d table (d_id int, b_id int, d int)

insert into @a Values (1,1), (2,2), (3,3)
insert into @b Values (21, 1, 21), (22, 1, 22), (23, 2, 23)
insert into @c Values (31, 1, 31), (32, 2, 32), (33, 3, 33)
insert into @d Values (41, 21, 41), (42, 21, 42), (43, 23, 43)


Таблица a мастер для b и c, таблица b - мастер для d.

Необходимо получить такую выборку, с учетом сортировки :
table a b c da 1 Null Null Nullb Null 21 Null Nulld Null Null Null 41d Null Null Null 42b Null 22 Null Nullc Null Null 31 Nulla 2 Null Null Nullc Null Null 32 Nullb Null 23 Null Nulld Null Null Null 42a 3 Null Null Nullc Null Null 33 Null
Сама выборка формируется тривиально:
Код: sql
1.
2.
3.
4.
5.
6.
7.
Select 'a' [table], a [a], Null [b], Null [c], Null [d] From @a
Union all
Select 'b' [table], Null [a], b [b], Null [c], Null [d] From @b
Union all
Select 'c' [table], Null [a], Null [b], c [c], Null [d] From @c
Union all
Select 'd' [table], Null [a], Null [b], Null [c], d [d] From @d


Но как ее отсортировать???
Правило сортировки: под каждой мастер - записью находятся детализирующие записи в порядке возрастания id и имен таблиц.
...
Рейтинг: 0 / 0
Помогите отсортировать выборку!
    #39915070
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извините, ошибся с сортировкой.
Правильно так:
table a b c da 1 Null Null Nullb Null 21 Null Nulld Null Null Null 41d Null Null Null 42b Null 22 Null Nullc Null Null 31 Nulla 2 Null Null Nullb Null 23 Null Nulld Null Null Null 43c Null Null 32 Nulla 3 Null Null Nullc Null Null 33 Null
...
Рейтинг: 0 / 0
Помогите отсортировать выборку!
    #39915072
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нельзя сортировать несвязанные наборы. Вернее, можно, но такая фигня получится...

Свяжите. Сортируйте (вернее, нумеруйте с нужной сортировкой). А потом к этому привязывайте нужное, и сортируйте по посчитанному номеру.
...
Рейтинг: 0 / 0
Помогите отсортировать выборку!
    #39915073
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему нельзя соединить таблицы, получить нужные значения и отсортировать?
...
Рейтинг: 0 / 0
Помогите отсортировать выборку!
    #39915076
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, да я понимаю, что нужно связать.
Я не понимаю, КАК связать!
...
Рейтинг: 0 / 0
Помогите отсортировать выборку!
    #39915080
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm, конечно можно. Не понимаю как. Утупился.
...
Рейтинг: 0 / 0
Помогите отсортировать выборку!
    #39915091
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
46.
WITH cte1 AS (
SELECT a.a_id a_id, 
       null   b_id, 
       null   c_id, 
       null   d_id
       FROM a
UNION ALL
SELECT a.a_id a_id, 
       b.b_id b_id, 
       null   c_id, 
       null   d_id
       FROM a
       JOIN b on a.a_id=b.a_id
UNION ALL
SELECT a.a_id a_id, 
       null   b_id, 
       c.c_id c_id, 
       null   d_id
       FROM a
       JOIN c on a.a_id=c.a_id
UNION ALL
SELECT a.a_id a_id, 
       b.b_id b_id, 
       null   c_id, 
       d.d_id d_id
       FROM a
       JOIN b on a.a_id=b.a_id
       JOIN d on b.b_id=d.b_id
),
cte2 as (
SELECT a_id,b_id,c_id,d_id, 
       row_number() over (order by a_id, 
                                   case when b_id is null and c_id is null then 1 else 2 end,
                                   case when c_id is null then 1 else 2 end,
                                   case when d_id is null then 1 else 2 end,
                                   b_id,
                                   c_id,
                                   d_id) rn
FROM cte1
)
select case when b_id is null and c_id is null then a_id else null end a_id,
       case when d_id is null then b_id else null end b_id,
       c_id,
       d_id
from cte2
order by rn



fiddle
...
Рейтинг: 0 / 0
Помогите отсортировать выборку!
    #39915092
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
with t as
(
 Select
  'a' [table], a [a], Null [b], Null [c], Null [d],
  a_id as v1, null as v2, null as v3,
  'a' as n1, null as n2, null as n3
 From @a
 
 Union all
 
 Select
  'b' [table], Null [a], b.b [b], Null [c], Null [d],
  a.a_id, b.b_id, null,
  'a', 'b', null
 From @b b join @a a on a.a_id = b.a_id

 Union all

 Select
  'c' [table], Null [a], null [b], c.c_id [c], Null [d],
  a.a_id, c.c_id, null,
  'a', 'c', null
 From @c c join @a a on a.a_id = c.a_id

 Union all

 Select
  'd' [table], Null [a], Null [b], Null [c], d [d],
  a.a_id, b.b_id, d.d_id,
  'a', 'b', 'd'
  From @d d join @b b on b.b_id = d.b_id join @a a on a.a_id = b.a_id
)
select
 [table], a, b, c, d
from
 t
order by
 n1, v1, n2, v2, n3, v3;
...
Рейтинг: 0 / 0
Помогите отсортировать выборку!
    #39915165
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, большое спасибо, понял!
invm , спасибо отдельно, мне Ваше решение показалось более прозрачным.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите отсортировать выборку!
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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