создать запрос, чтобы получить все компоненты, которые относятся ко всем выбранным идентификаторам веществ - PullRequest
0 голосов
/ 18 октября 2018

Нужна ваша помощь в создании некоего SQL-запроса оракула, давайте сначала посмотрим на структуру моих таблиц

Component table has two cols id(pk) and name

Substance table has two cols id(pk) and name

Компонент состоит из множества веществ, поэтому я создал третью таблицу. Comp_Subs имеет два столбца comp_id(fk to Component) иsub_id(fk to substance) и cols вместе уникальны.

Учитывая некоторые идентификаторы веществ, создайте запрос, чтобы получить все компоненты, которые имеют все данные вещества

Таблица схемы

Пример: с учетом этих идентификаторов веществ 1, 2, 3 создайте запрос, который будет извлекать все компы, в которых есть все выбранные вещества.

input: 1,2,3

В выводе будет один столбец, содержащий результат, подобный этому

Выход

Результат приведенного примера должен возвращать comp1 и comp2, поскольку comp1 содержит вещества 1, 2 и 3 Иcomp2 также содержит 1, 2 и 3

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Вы можете получить вывод, выбрав comp_subs записи с желаемыми sub_id, сгруппированными по comp_id, например:

select comp_id
from comp_subs
where subs_id in (1,2,3)
group by comp_id;
0 голосов
/ 18 октября 2018

Использование GROUP BY и HAVING:

Скрипка SQL

Настройка схемы Oracle 11g R2 :

CREATE TABLE Comp_Sub ( comp_id, sub_id ) AS
  SELECT 1, 1 FROM DUAL UNION ALL
  SELECT 1, 2 FROM DUAL UNION ALL
  SELECT 1, 3 FROM DUAL UNION ALL
  SELECT 2, 1 FROM DUAL UNION ALL
  SELECT 2, 2 FROM DUAL UNION ALL
  SELECT 2, 3 FROM DUAL UNION ALL
  SELECT 2, 4 FROM DUAL UNION ALL
  SELECT 3, 1 FROM DUAL UNION ALL
  SELECT 3, 5 FROM DUAL UNION ALL
  SELECT 3, 7 FROM DUAL;

Запрос 1 :

SELECT comp_id
FROM   comp_sub
WHERE  sub_id IN ( 1, 2, 3 )
GROUP BY comp_id
HAVING COUNT( sub_id ) = 3

Результаты :

| COMP_ID |
|---------|
|       1 |
|       2 |

Если вам нужны имена, присоединяйтесьрезультаты к таблице Component.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...