在SQL中匹配至少包含一次的行

时间:2018-12-04 10:40:15

标签: sql sql-server

我有一个用户表:

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)。

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