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

У меня есть метод Java, который получает список строк в качестве параметра, и я хочу получить строки, которые точно соответствуют всем значениям списка (не больше, не меньше).

У меня есть две таблицы (таблица дел и таблица товаров), которая имеет отношение многие ко многим.

CASES_TABLE
ID    CASES_COMMENT       ...
1      Some comment       ...
2      Some comment2      ...
3      Some comment3      ...
...        ...

PRODUCTS_TABLE
ID   PRODUCT_CODE
1     VoIP
2     IPTV
3     PSTN
...    ...

 CASES_PRODUCTS_TABLE
CASE_ID   PRODUCT_ID
1         1
2         1
2         2
2         3
3         1
3         2
...    ...

Я использую Oracle в качестве rdbms.

Например:

Given the list:
  List<String> products = Stream.of("VoIP", "IPTV","PSTN").collect(Collectors.toList());;

и метод Строка getSomeValue (Список продуктов);

То, что я хотел бы получить, это случай с идентификатором 2, потому что это тот, который точно соответствует всем значениям (не случай с идентификатором 1, потому что он соответствует только одному значению, а не случай с идентификатором 2). потому что он соответствует только двум значениям).

Я читал о реляционном делении, но думаю, что это не решит мою проблему. Я также пробовал с условием IN, но оно выполняет 'ИЛИ', и я хочу, чтобы мой запрос фильтровал точно по всем значениям, не оставляя ни одного левого или получая строку, у которой есть значение, которого нет в списке.

Я попробовал следующее:

SELECT CASES_COMMENT
FROM CASES_TABLE CT JOIN CASES_PRODUCTS_TABLE CPT
ON CT.ID = CPT.CASE_ID
JOIN PRODUCTS_TABLE
ON PT.ID = CPT.PRODUCT_ID
WHERE PRODUCT_CODE IN ('VoIP', 'PSTN', 'IPTV');

Ответы [ 3 ]

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

Это можно сделать несколькими способами (аналитическая функция является одной из них) Посмотрите на этот ответ для подсказок Oracle SQL-запрос со всеми обязательными значениями, в которых условие

Одно из решений, повторное использование собственного запроса:

select CASES_COMMENT from
(select CASES_COMMENT , count(*) occurance from (
SELECT CASES_COMMENT
FROM CASES_TABLE CT JOIN CASES_PRODUCTS_TABLE CPT
ON CT.ID = CPT.CASE_ID
JOIN PRODUCTS_TABLE PT
ON PT.ID = CPT.PRODUCT_ID
WHERE PRODUCT_CODE IN ('VOIP', 'PSTN', 'IPTV'))
group by cases_comment)
where occurance = 3;

Для этого запроса вам понадобится другой вход, который является длиной или размером массива ввода, который вы ищете

Sql Fiddle Link с примером: http://sqlfiddle.com/#!4/29cd9/5

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

Я думаю, что группировка и подсчет должны производить то, что вам нужно:

select
    cp.case_id
  from products_table p
  join cases_products_table cp on cp.product_id = p.id
  where p.product_code in ('VoIP', 'PSTN', 'IPTV')
  group by cp.case_id
  having count(*) = 3

Этот запрос должен возвращать только CASE_ID = 2, поскольку это единственный продукт, имеющий три продукта.

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

Я думаю, что единственный способ сделать это с JQL - это подзапросы

Пример:

SELECT CASES_COMMENT
FROM (SELECT * 
      FROM (SELECT *
            FROM CASES_TABLE CT JOIN CASES_PRODUCTS_TABLE CPT
            ON CT.ID = CPT.CASE_ID
            JOIN PRODUCTS_TABLE
            ON PT.ID = CPT.PRODUCT_ID
            WHERE PRODUCT_CODE = 'VoIP') as cond1
      WHERE cond1.PRODUCT_CODE = 'PSTN') as cond2
WHERE cond2.PRODUCT_CODE = 'IPTV'

Конечно, вы можете создать его динамически, чтобы вместить столько строк, сколько хотите.

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