如何在sql中以多行为条件进行过滤

问题描述 投票:2回答:3

我正在寻找一种过滤两行条件的方法。通常,在基本sql中,可以使用whereandor语句来过滤查询。如果我想过滤两行呢?我想在以下示例中找到每个患者,它们属于两组。

如果我使用

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

显然,它不起作用。我可以想象使用循环的方法,但是对我来说这似乎效率很低。那么我该如何查询“用两个特定的组值查找每个患者”?在此示例中,我正在寻找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

VBoka提到,使用“组”作为列名是不好的,是的。我想指出这一点,因为我不想更改问题。

sql relational-division
3个回答
1
投票

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,因为在您的列名称中使用关键字不是一种好习惯。


1
投票
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

第二选择是获取其余信息。如果患者姓名足以满足您的需求,那么内部查询就足够了。请注意,在拥有之前过滤器在哪里。


0
投票
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'
    )
© www.soinside.com 2019 - 2024. All rights reserved.