我有一个java方法,该方法接收一个字符串列表作为参数,并且我想获取与该列表的所有值完全匹配的行(不多也不少)。
我有两个表(一个Cases表和一个Products表),它们之间具有多对多关系。
Cookie: JSESSIONID=...
我将Oracle用作rdbms。
例如:
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
... ...
和方法 字符串getSomeValue(列出产品);
我想得到的是ID为2的情况,因为那是完全匹配所有值的情况(ID为1的情况并非如此,因为它仅匹配一个值,而ID为2的情况并非如此因为它只匹配两个值)。
我已经阅读了有关关系划分的信息,但是我认为这不能解决我的问题。我也尝试使用IN条件,但是它执行“ OR”操作,并且我希望我的查询按所有值精确过滤,而不会留下一个左值或得到行中没有该值的行。>
我尝试了以下操作:
Given the list:
List<String> products = Stream.of("VoIP", "IPTV","PSTN").collect(Collectors.toList());;
答案 0 :(得分:0)
我认为使用JQL的唯一方法是使用子查询
示例:
also
当然,您可以动态创建它以适合您想要的任意数量的字符串。
答案 1 :(得分:0)
这可以通过多种方式完成(解析函数是其中之一) 查看此答案以获取提示 Oracle sql query with all mandatory values in where condition
一种通过重用自己的查询的解决方案是
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链接示例: http://sqlfiddle.com/#!4/29cd9/5
答案 2 :(得分:0)
我认为分组和计数应该可以满足您的需求:
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,因为这是唯一具有三种产品的查询。