powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Найти полное вхождение
6 сообщений из 6, страница 1 из 1
Найти полное вхождение
    #39777080
r.r3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица вида:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare @t table (id int, elementid int)

insert into @t(id, elementid)
values(1, 1),
(1, 2),
(1, 3),
(2, 1),
(2, 2),
(2, 3),
(3, 1),
(3, 2),
(4, 5),
(5, 5)



Необходимо вывести все пары ID этой таблицы, в которых есть полное пересечение по полю elementid.
В примере это
1, 2 (полное пересечение по elementid = 1, 2, 3)
4, 5 (полное пересечение по elementid = 5)

Как это сделать?
...
Рейтинг: 0 / 0
Найти полное вхождение
    #39777082
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r.r3d,

почитать про реляционное деление?
...
Рейтинг: 0 / 0
Найти полное вхождение
    #39777086
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r.r3d,

но как вариант - можно посмотреть и в сторону полного соединения (FULL JOIN)
...
Рейтинг: 0 / 0
Найти полное вхождение
    #39777097
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r.r3d,

Что такое полное пересечение по elementid ? Я не понял почему именно эти пары Вы отобрали. Опишите алгоритм пожалуйста
...
Рейтинг: 0 / 0
Найти полное вхождение
    #39777162
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r.r3d,

соедините выбирайте из таблицы записи, если существуют строки этой же таблицы экземпляра, граничные значения которых полностью покрываются границами первого. Т.е. exists () выражение.
...
Рейтинг: 0 / 0
Найти полное вхождение
    #39777758
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r.r3d,

как-то так + string_agg на них натравить
Код: 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.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
DECLARE 
  @t TABLE ( [id] INT, [elementid] INT )
;
INSERT
INTO 
  @t( [id], [elementid] )
VALUES
  ( 1, 1 ),
  ( 1, 2 ),
  ( 1, 3 ),
  ( 2, 1 ),
  ( 2, 2 ),
  ( 2, 3 ),
  ( 3, 1 ),
  ( 3, 2 ),
  ( 4, 5 ),
  ( 5, 5 )
;
WITH
t1 AS (
  SELECT
    [id],
    [min] = MIN( [elementid] ),
    [max] = MAX( [elementid] ),
    [cnt] = COUNT( [elementid] )
  FROM
    @t 
  GROUP BY
    [id]
),
t2 AS (
  SELECT
    *,
    [rn]  = DENSE_RANK()
            OVER (
              PARTITION BY 
                [min],
                [max],
                [cnt]
              ORDER BY
                [id] )
  FROM
    t1
),
t3 AS (
  SELECT
    [min],
    [max],
    [cnt],
    [gr] = ROW_NUMBER() OVER ( ORDER BY 1/0 )
  FROM
    t2
  GROUP BY
    [min],
    [max],
    [cnt]
  HAVING
    MAX( [rn] ) > 1
)
SELECT
  t3.[gr],
  t1.[id]
FROM
  t3
  INNER JOIN t1 ON (
        t1.[min] = t3.[min]
    AND t1.[max] = t3.[max]
    AND t1.[cnt] = t3.[cnt] )
;

...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Найти полное вхождение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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