我有一个用户表:
ID Name OID TypeID
1 a 1 1
2 b 1 2
3 c 1 3
4 d 2 1
5 e 2 1
6 f 2 2
7 g 3 2
8 h 3 2
9 i 3 2
对于此表,我想按OID和TypeID进行过滤,以便获得由OID过滤并包含TypeID中的所有1、2和3的行。
例如,在OID = 1的情况下,我们的TypeID为1、2和3,但我不应该获取ID为4-6的行,因为对于ID 4-6,OID相同,但TypeID不包括每个(1、2和3)。
答案 0 :(得分:2)
您可以:
select oid
from table t
where typeid in (1,2,3)
group by oid
having count(*) = 3;
如果oid
包含重复的typeid
,则可以改用count(distinct typeid)
。
答案 1 :(得分:0)
您可以使用存在
select oid from table t1
where exists ( select 1 from table t1 where t1.oid=t2.oid
group by t2.oid
having (distinct TypeID)=3
)
假定TypeID 1,2,3
答案 2 :(得分:0)
如果使用的是sql-server,则可以尝试此操作。
DECLARE @SampleData TABLE(ID INT, Name VARCHAR(5), OID INT, TypeID INT)
INSERT INTO @SampleData VALUES
(1 , 'a', 1, 1),
(2 , 'b', 1, 2),
(3 , 'c', 1, 3),
(4 , 'd', 2, 1),
(5 , 'e', 2, 1),
(6 , 'f', 2, 2),
(7 , 'g', 3, 2),
(8 , 'h', 3, 2),
(9 , 'i', 3, 2)
SELECT * FROM @SampleData D
WHERE NOT EXISTS (
SELECT * FROM @SampleData D1
RIGHT JOIN (VALUES (1),(2),(3)) T(TypeID) ON D1.TypeID = T.TypeID
AND D.OID = D1.OID
WHERE D1.TypeID IS NULL
)
结果:
ID Name OID TypeID
----------- ----- ----------- -----------
1 a 1 1
2 b 1 2
3 c 1 3