SQL выбирает строки, в которых значение одного столбца является общим для столбца другого критерия

13
задан Maciek 11 September 2009 в 09:54
поделиться

3 ответа

Я предполагаю, что естественный ключ этой таблицы - это document_id + subject_id, и этот id является суррогатом; IOW, document_id и subject_id уникальны. Таким образом, я просто собираюсь притвориться, что его не существует и что на естественный ключ существует уникальное ограничение.

Начнем с очевидного.

SELECT document_id, subject_id
  FROM document_subjects
 WHERE subject_id IN (17,76)

Это дает вам все, что вы хотите плюс ] вещи, которые вам не нужны. Так что все, что нам нужно сделать, это отфильтровать остальное. «Другой материал» - это группы строк, количество которых не равно количеству желаемых предметов.

SELECT document_id
  FROM document_subjects
 WHERE subject_id IN (17,76)
 GROUP BY document_id
HAVING COUNT(*) = 2

Обратите внимание, что subject_id удаляется, поскольку он не участвует в группировке. Сделав еще один шаг, я собираюсь добавить воображаемую таблицу с именем subject_i_want, которая содержит N строк с нужными вам предметами.

SELECT document_id
  FROM document_subjects
 WHERE subject_id IN (SELECT subject_id FROM subjects_i_want)
 GROUP BY document_id
HAVING COUNT(*) = (SELECT COUNT(*) FROM subjects_i_want)

Очевидно, что subject_i_want можно было заменить другим подзапросом, временной таблицей или чем-то еще. Но если у вас есть этот список document_id, вы можете использовать его в подвыборке более крупного запроса.

SELECT document_id, subject_id, ...
  FROM document_subjects
 WHERE document_id IN(
        SELECT document_id
          FROM document_subjects
          WHERE subject_id IN (SELECT subject_id FROM subjects_i_want)
          GROUP BY document_id
         HAVING COUNT(*) = (SELECT COUNT(*) FROM subjects_i_want))

Или что угодно.

28
ответ дан 1 December 2019 в 08:53
поделиться

Это очень интересный вопрос.

Я предполагаю, что вам нужен более общий запрос, но это то, что я сделал бы в случае, когда у вас всегда одинаковое количество субъектов (скажем, два):

 SELECT T.id, T.document_id, T.subject_id
   FROM table T
        INNER JOIN table T1 ON T.document_id = T1.document_id AND T1.subject_ID = 17
        INNER JOIN table T2 ON T.document_id = T2.document_id AND T2.subject_ID = 76            

Конечно, вы можете добавить еще одно ВНУТРЕННЕЕ СОЕДИНЕНИЕ, чтобы добавить еще один идентификатор объекта ... Но я признаю, что это не очень хорошее общее решение.

1
ответ дан 1 December 2019 в 08:53
поделиться
select document_id from table1
 where subject_id in (17, 76)
 group by document_id
having count(distinct subject_id) = 2
0
ответ дан 1 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: