同一列上的多个条件

问题描述:

如何使用同一列上的多个条件进行搜索。 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与苹果和猕猴桃相匹配,尽管苹果是重复的?

+1

我们如何知道查询是否正确?你发布输入(完美!)和一些代码,显然不会做你想做的(也很有帮助)。你没有说明要求。你需要返回什么?所有的原始行,仅适用于与Apple,Orange和Kiwi一起出现的T1_ID至少一次?正好一次?究竟是那三个而不是其他?所有这些可能的解释都与你发布的内容一致。那么:什么是要求? – mathguy

+0

@mathguy:所有Apple,Orange和Kiwi,3个值至少一次。我的问题是从我当前的查询,如果我做了一个值= 3,它不起作用,因为一些记录可能有重复,例如:ID = 5。 – Skn

你并不需要加入t1,你需要COUNT(DISTINCT column_name)

SQL Fiddle

的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 

Results

| 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" 

Results

| T1_ID |   values | 
|-------|-------------------| 
|  1 | Apple,Kiwi,Orange | 
+1

这试图解决什么要求?当OP没有发布要求时,如果您仍然会提供答案,这将有助于说明您的假设。例如:如果T1_ID也有另一个带有“Banana”的行 - 是否需要在'values'字符串中连接? (根据OP的要求,根本不清楚,即使否则LISTAGG是必需的。) – mathguy