Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Найти полное вхождение  [new]
r.r3d
Member

Откуда:
Сообщений: 1
Есть таблица вида:
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)

Как это сделать?
21 фев 19, 07:52    [21815997]     Ответить | Цитировать Сообщить модератору
 Re: Найти полное вхождение  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
r.r3d,

почитать про реляционное деление?
21 фев 19, 07:58    [21815999]     Ответить | Цитировать Сообщить модератору
 Re: Найти полное вхождение  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
r.r3d,

но как вариант - можно посмотреть и в сторону полного соединения (FULL JOIN)
21 фев 19, 08:14    [21816003]     Ответить | Цитировать Сообщить модератору
 Re: Найти полное вхождение  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2382
Блог
r.r3d,

Что такое полное пересечение по elementid ? Я не понял почему именно эти пары Вы отобрали. Опишите алгоритм пожалуйста
21 фев 19, 09:30    [21816020]     Ответить | Цитировать Сообщить модератору
 Re: Найти полное вхождение  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7407
r.r3d,

соедините выбирайте из таблицы записи, если существуют строки этой же таблицы экземпляра, граничные значения которых полностью покрываются границами первого. Т.е. exists () выражение.
21 фев 19, 11:46    [21816128]     Ответить | Цитировать Сообщить модератору
 Re: Найти полное вхождение  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
r.r3d,

+ как-то так + string_agg на них натравить
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] )
;
22 фев 19, 10:32    [21817073]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить