如何根据 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"?在这个例子中,我正在寻找 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
有人提到,使用 "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)
P.S。我已将列名称 group
更改为 group_c
,因为在列名称中使用关键字不是一个好习惯。
我正在寻找一种方法来过滤两行条件。一般来说,在基本 sql 中,可以使用 where
and
or
语句来过滤查询。如果我想过滤两行怎么办。我想在下面的示例中找到属于两个组的每个患者。
如果我使用:
select * from table
where group = group1 and group = group2
显然它不起作用。
如何查询"find every patient with two specific group values"?在这个例子中,我正在寻找 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
有人提到,使用 "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)
P.S。我已将列名称 group
更改为 group_c
,因为在列名称中使用关键字不是一个好习惯。