Как фильтровать кондиционированные по нескольким строкам в sql - PullRequest
2 голосов
/ 25 февраля 2020

Я ищу способ фильтрации по двум условиям строки. В основном в basi c sql можно использовать операторы where and or для фильтрации запроса. Что делать, если я хочу отфильтровать две строки. Я хочу найти каждого пациента в следующем примере, который принадлежит обеим двум группам.

Если я использую:

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

, очевидно, это не работает.

Как я могу запросить "найти каждого пациента с двумя указанными c значениями группы"? В этом примере я ищу 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

Было упомянуто, что использование «группы» в качестве имени столбца неверно, это правда. Я хотел указать на это, так как я не хочу менять вопрос.

Ответы [ 3 ]

2 голосов
/ 25 февраля 2020
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'
    )
2 голосов
/ 25 февраля 2020

Использование 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)

Вот демонстрационная версия для SQLServer

PS Я изменил имя столбца group в group_c, поскольку не рекомендуется использовать ключевые слова в именах столбцов.

1 голос
/ 25 февраля 2020
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

Второй выбор для получения остальной информации. Если вам достаточно имени пациента, то внутреннего запроса будет достаточно. Обратите внимание, что где фильтры, прежде чем иметь.

...