同一列上的多个条件
问题描述:
如何使用同一列上的多个条件进行搜索。 T1有ID。同一列上的多个条件
T2:
ID T1_ID(FK) Value
1 1 Apple
2 1 Orange
3 1 Kiwi
4 2 Orange
5 2 Kiwi
6 3 Pear
7 3 Berry
8 3 Orange
9 4 Apple
10 5 Apple
11 5 Apple
12 5 Kiwi
输出:
T2_ID(FK) Value
1 Apple
1 Orange
1 Kiwi
select t2.t1_id, t2.value
from t1, t2
where t1.id = t2.id
and t2.value in ('Apple','Orange','Kiwi')
group by t1.id having count(t2.value)=3
这是查询是否正确?是否它也带来t2_id = 5,因为#5与苹果和猕猴桃相匹配,尽管苹果是重复的?
答
你并不需要加入t1
,你需要COUNT(DISTINCT column_name)
:
的Oracle 11g R2架构设置:
CREATE TABLE t2 (ID, T1_ID, Value) AS
SELECT 1, 1, 'Apple' FROM DUAL UNION ALL
SELECT 2, 1, 'Orange' FROM DUAL UNION ALL
SELECT 3, 1, 'Kiwi' FROM DUAL UNION ALL
SELECT 4, 2, 'Orange' FROM DUAL UNION ALL
SELECT 5, 2, 'Kiwi' FROM DUAL UNION ALL
SELECT 6, 3, 'Pear' FROM DUAL UNION ALL
SELECT 7, 3, 'Berry' FROM DUAL UNION ALL
SELECT 8, 3, 'Orange' FROM DUAL UNION ALL
SELECT 9, 4, 'Apple' FROM DUAL UNION ALL
SELECT 10, 5, 'Apple' FROM DUAL UNION ALL
SELECT 11, 5, 'Apple' FROM DUAL UNION ALL
SELECT 12, 5, 'Kiwi' FROM DUAL;
查询1:
select t1_id,
LISTAGG(value, ',') WITHIN GROUP (ORDER BY value) As "values"
from t2
where value in ('Apple','Orange','Kiwi')
group by t1_id
having count(DISTINCT value) = 3
| T1_ID | values |
|-------|-------------------|
| 1 | Apple,Kiwi,Orange |
查询2:
您也可以使用集合做到这一点:
CREATE TYPE STRINGLIST IS TABLE OF VARCHAR2(10);
/
SELECT *
FROM (
SELECT t1_id,
CAST(COLLECT(value ORDER BY value) AS STRINGLIST) AS "values"
FROM t2
GROUP BY t1_id
)
WHERE STRINGLIST('Apple', 'Kiwi', 'Orange') SUBMULTISET OF "values"
| T1_ID | values |
|-------|-------------------|
| 1 | Apple,Kiwi,Orange |
+1
这试图解决什么要求?当OP没有发布要求时,如果您仍然会提供答案,这将有助于说明您的假设。例如:如果T1_ID也有另一个带有“Banana”的行 - 是否需要在'values'字符串中连接? (根据OP的要求,根本不清楚,即使否则LISTAGG是必需的。) – mathguy
我们如何知道查询是否正确?你发布输入(完美!)和一些代码,显然不会做你想做的(也很有帮助)。你没有说明要求。你需要返回什么?所有的原始行,仅适用于与Apple,Orange和Kiwi一起出现的T1_ID至少一次?正好一次?究竟是那三个而不是其他?所有这些可能的解释都与你发布的内容一致。那么:什么是要求? – mathguy
@mathguy:所有Apple,Orange和Kiwi,3个值至少一次。我的问题是从我当前的查询,如果我做了一个值= 3,它不起作用,因为一些记录可能有重复,例如:ID = 5。 – Skn