DeusModus
@DeusModus

Принадлежность к определенному множеству — и не к какому другому [sql]

Привет хабр.

Я слегка вскипел себе голову, возможно простой задачей, но на ум ничего не идет.

Есть у нас Множества X, например (1,2; 2,3,4; 7,9,1; 1,0), есть множество Y, например (1,2,3,4,5,6,7,8)
Можно ли показать из X только то, что в полной мере присутствует в Y? В примере подходит только (1,2; 2,3,4).

Если по-простому то же что делает IN конструкция, но не для каждого члена (1 есть в Y, значит удовлетворяет условию), а по всей коллекции.
Псевдосинтаксис:
SELECT t1.id FROM table1 t1, table2 t2 WHERE t2.key NOT FULLY IN(SELECT id FROM table3)
  • Вопрос задан
  • 5443 просмотра
Решения вопроса 1
@ComodoHacker
Начнем с понимания того, что X это множество множеств, а Y это множество элементов. Поэтому, сравнивать можно (и нужно) Y и элементы X, либо элементы Y и «элементы элементов» X.

Дальше, обозначим элемент X как x. То, что x является подмножеством Y, на SQL можно выразить так

not exists (
    select 1
      from x left join Y on x.id = Y.id
     where Y.id is null
)

Дальше, возвращаясь к вашей задаче, нужно уточнить, как у вас хранится множество X. Например, если в одной таблице X (set_id, element_id), то можно соединить ее с Y внешним соединением, как выше, а затем отфильтровать множества, не полностью содержащиеся в Y. Для этого хорошо подойдут аналитические функции, если ваша СУБД их поддерживает в должном объеме. Опять требуется уточнение.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Silver_Clash
Может что то такое подойдет:

select t1.id from table t1 where t1.key NOT in (подзапрос транспонирующий столбец в строку при помощи SYS_CONNECT_BY_PATH...) ???

то что в скобочках сразу не напишу, надо вспомнить :)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы