我正在寻找一种过滤两行条件的方法。通常,在基本sql中,可以使用where
and
or
语句来过滤查询。如果我想过滤两行呢?我想在以下示例中找到每个患者,它们属于两组。
如果我使用
select * from table
where group = group1 and group = group2
显然,它不起作用。我可以想象使用循环的方法,但是对我来说这似乎效率很低。那么我该如何查询“用两个特定的组值查找每个患者”?在此示例中,我正在寻找group1
和group2
,因此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提到,使用“组”作为列名是不好的,是的。我想指出这一点,因为我不想更改问题。
与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)
P.S。我已将列group
的名称更改为group_c
,因为在您的列名称中使用关键字不是一种好习惯。
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 *
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'
)