如何根据 sql 中的多行进行过滤

How to filter conditioned on multiple rows in sql

我正在寻找一种方法来过滤两行条件。一般来说,在基本 sql 中,可以使用 where and or 语句来过滤查询。如果我想过滤两行怎么办。我想在下面的示例中找到属于两个组的每个患者。

如果我使用:

select *  from table
where group = group1 and group = group2 

显然它不起作用。

如何查询"find every patient with two specific group values"?在这个例子中,我正在寻找 group1group2,所以 peter 不应该匹配,尽管他在两个组中。

 Student
    id | patient | group
    1  | jhon    | group1
    2  | jack    | group1
    3  | jill    | group2
    4  | jack    | group2
    5  | jill    | group1
    6  | peter   | group2
    7  | peter   | group3

预期输出(不需要排序):

 Student
    id | patient | group
    1  | jack    | group1
    2  | jack    | group2
    3  | jill    | group1
    4  | jill    | group2

有人提到,使用 "group" 作为列名是错误的,这是真的。我想指出这一点,因为我不想改变这个问题。

SELECT
 *
FROM (SELECT 
        patient
      FROM Student 
      WHERE group = 'group1' OR group = 'group2'
      GROUP BY patient
      HAVING COUNT(*) = 2) A
INNER JOIN Student ON Student.patient = A.patient

第二个 select 用于获取其余信息。如果患者姓名对您来说足够了,那么内部查询就足够了。注意 where 在 having 之前进行过滤。

SELECT * 
FROM Student 
WHERE patient IN (
    SELECT s1.patient 
    FROM Student s1
    INNER JOIN Student s2
    ON s2.patient = s1.patient
    AND s2.group = 'group2'
    WHERE s1.group = 'group1'
    )

IN 运算符与 count distinct 一起使用:

select * 
from student 
where patient in (select patient
                  from student
                  where group_c in ('group1', 'group2')
                  group by patient
                  having count(distinct group_c) = 2)

Here is a demo for SQLServer

P.S。我已将列名称 group 更改为 group_c,因为在列名称中使用关键字不是一个好习惯。