powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос многие ко многим .
7 сообщений из 7, страница 1 из 1
Запрос многие ко многим .
    #40092845
RIO08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть 2 таблицы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE [dbo].[z1](
	[z1] [int] NOT NULL,
	[z2] [int] NOT NULL)
go
CREATE TABLE [dbo].[zz2](
	[z11] [int] NOT NULL,
	[z22] [int] NOT NULL)

go
insert into z1 (z1, z2) values (1,1), (1,2), (1,3),(1,4),(2,22),(2,23),(2,24),(3,33),(3,34),(4,444),(5,555)
go
insert into zz2 (z11, z22) values (1,111), (1,222), (1,333),(1,444), (1,555),(1,666), (2,2222),(2,2232),(2,2242),(3,3331),(3,3332)
go



Нужно таблицу вида:

z1 z2 z11 z22
1 1 1 111
1 2 1 222
1 3 1 333
1 4 1 444
2 22 2 2222
2 23 2 2232
2 24 2 2242
3 33 3 3331
3 34 3 3332

Можно ли это реализовать запросом или обязательно курсор? Если можно приведите пример реализации.
...
Рейтинг: 0 / 0
Запрос многие ко многим .
    #40092847
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RIO08,

?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT *
  FROM z1 AS a
   JOIN zz2 AS b ON a.z1 = b.z11 AND b.z22 LIKE concat(a.z2, '%');


z1          z2          z11         z22
----------- ----------- ----------- -----------
1           1           1           111
1           2           1           222
1           3           1           333
1           4           1           444
2           22          2           2222
2           22          2           2232
2           22          2           2242
3           33          3           3331
3           33          3           3332



P.S. - немного не то ...
...
Рейтинг: 0 / 0
Запрос многие ко многим .
    #40092852
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
WITH A
     AS (SELECT *, 
                DENSE_RANK() OVER(ORDER BY z1) AS dr, 
                ROW_NUMBER() OVER(PARTITION BY z1 ORDER BY z2) AS rn
           FROM z1),
     B
     AS (SELECT *, 
                DENSE_RANK() OVER(ORDER BY z11) AS dr, 
                ROW_NUMBER() OVER(PARTITION BY z11 ORDER BY z22) AS rn
           FROM zz2)
     SELECT a.z1, 
            a.z2, 
            b.z11, 
            b.z22
       FROM a
            OUTER APPLY
     (
         SELECT TOP 1 *
           FROM b
          WHERE a.z1 = b.z11
                AND b.dr = a.dr
                AND b.rn >= a.rn
     ) AS b
      WHERE b.rn IS NOT NULL;




z1          z2          z11         z22
----------- ----------- ----------- -----------
1           1           1           111
1           2           1           222
1           3           1           333
1           4           1           444
2           22          2           2222
2           23          2           2232
2           24          2           2242
3           33          3           3331
3           34          3           3332
...
Рейтинг: 0 / 0
Запрос многие ко многим .
    #40092853
RIO08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg_SQL --- Спасибо, но не то... Тут должен быть принцип FIFO, но что то не могу сообразить, как реализовать :(
...
Рейтинг: 0 / 0
Запрос многие ко многим .
    #40092854
RIO08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо Огромное!
...
Рейтинг: 0 / 0
Запрос многие ко многим .
    #40092856
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RIO08,

только в OUTER APPLY (...) пропустил

Код: sql
1.
ORDER BY b.dr, b.rn



так будет правильнее.
...
Рейтинг: 0 / 0
Запрос многие ко многим .
    #40092974
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так проще
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
	  WITH A
     AS (SELECT *, 
                ROW_NUMBER() OVER(PARTITION BY z1 ORDER BY z2) AS rn
           FROM z1),
     B
     AS (SELECT *, 
                ROW_NUMBER() OVER(PARTITION BY z11 ORDER BY z22) AS rn
           FROM zz2)
select z1,	z2,	z11, z22

from A full join B
on a.rn = b.rn
and a.z1 = b.z11
where a.z1 is not null and b.z11 is not null
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос многие ко многим .
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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