SQL как выбрать идентификаторы участников с определенными c значениями строк в той же таблице, где эти значения строк взяты из списка поиска в другой схеме? - PullRequest
0 голосов
/ 18 июня 2020

Я хочу выбрать участников из таблицы, у которых есть диагнозы Рак и Диабет в столбце B

Например:

ParticipantID Diagnosis
1234          Cancer 
1234          Diabetes
4567          Cancer
4567          Lung Disease
8910          Stroke
1256          Lung Disease
3489          Chron's Disease

Как мне написать запрос, который позволяет мне выбрать участников, у которых есть два (или более) из определенных диагнозов, например, я хочу видеть только участников, у которых есть и рак, и диабет? (в приведенном выше примере идентификатор участника 1234)

Я попытался сделать простой оператор выбора:

SELECT diagnosisifknown.participantid
diagnosisifknown.diagnsis
diagnosisifknown.date
FROM
diagnosisifknown
where diagnosis ="1" and "10"; 

(значения для этих диагнозов в таблице поиска)

Я хочу получить такой результат:

1234   Cancer
1234   Diabetes

Ответы [ 3 ]

0 голосов
/ 18 июня 2020

Вы можете делать с cte, и вот демонстрация .

with cte as
(
  select
    ParticipantID
  from myTable
  where Diagnosis in ('Cancer', 'Diabetes')
  group by
      ParticipantID
  having count(ParticipantID) > 1
)

select
    c.ParticipantID,
    m.Diagnosis
from cte c
join myTable m
on c.ParticipantID = m.ParticipantID

вывод:

| participantid | diagnosis |
| ------------- | --------- |
| 1234          | Cancer    |
| 1234          | Diabetes  |
0 голосов
/ 18 июня 2020

Если вы хотите участников , вы можете использовать:

SELECT d.participantid
FROM diagnosisifknown d
WHERE diagnosis IN ('Cancer', 'Diabetes')
GROUP BY d.participantid
HAVING COUNT(*) = 2;

Если вам нужны исходные строки, я могу предложить EXISTS:

select d.*
from diagnosisifknown d
where exists (select 1
              from diagnosisifknown d2
              where d2.participantid = d.participantid and d2.diagnosis = 'Cancer'
             ) and
      exists (select 1
              from diagnosisifknown d2
              where d2.participantid = d.participantid and d2.diagnosis = 'Diabetes'
             ) ;
0 голосов
/ 18 июня 2020

Агрегация предоставляет один простой вариант:

SELECT ParticipantID
FROM yourTable
GROUP BY ParticipantID
HAVING MIN(Diagnosis) <> MAX(Diagnosis);

Вы также можете использовать exists logi c здесь:

SELECT t1.ParticipantID
FROM yourTable t1
WHERE EXISTS (SELECT 1 FROM yourTable t2
              WHERE t2.ParticipantID = t1.ParticipantID AND t2.Diagnosis <> t1.Diagnosis);
...