Выбор сущностей, которые содержат все значения внутри предложения WHERE IN - PullRequest
0 голосов
/ 09 марта 2019

Я хочу отобразить все объекты, которые имеют все значения, которые я помещаю в WHERE IN, поэтому я сделал это, используя HAVING COUNT (*) = 5;

SELECT d.semundjeName
FROM rel r JOIN
semundjet d
ON r.semundjeID = d.semundjeID
WHERE r.simptomaID IN (1, 2, 3, 4, 5)
GROUP BY d.semundjeName
HAVING COUNT(*) = 5; 

, и это работаетхорошо, но я хочу сделать то же самое, но с именами, а не идентификаторами, поэтому я сделал

select semundjeName
from simptomat 
left join rel
on rel.semundjeID = semundjet.semundjeID
left join semundjet
on semundjet.semundjeID = rel.semundjeID
where simptomaName IN ('Merzi','Dhimbje Koke','Gjakederdhje','Dhimbje 
Fyti','Dhimbje Kycesh')
group by semundjeName
HAVING COUNT(*) = 5; 

, и это не похоже на работу.Могу ли я сделать то же самое, не используя HAVING COUNT (*) вообще?Это означает, что нужно отображать только те объекты, которые содержат все значения внутри WHERE IN.

#semundjet - holds all disease names
######################################
semundjeID | semundjeName     
-----------------------
1            Malarja       
2            Epilepsi    
3            Depresion
4            Tuberkuloz
5            Kancer


#simptomat - holds all symptoms
#################################
simptomaID | simptomaName
------------------------- 
1            Merzi       
2            Dhimbje Koke    
3            Gjakederdhje
4            Dhimbje Fyti
5            Dhimbje Kycesh


 #rel - holds relation between diseases and symptoms
 ######################################################
 relID  | semundjeID | simptomaID
 -----------------------------
 1         1          1
 2         1          2
 3         3          1
 4         3          2
 5         3          3
 6         4          4
 7         5          5
 8         5          1
 9         5          2
 10        5          3
 11        5          4

Ожидаемым выводом будет "Kancer", поскольку это единственная сущность, которая содержит все симптомы "simptomaID", и я могу получить этот вывод из первого запроса, но не из второго.

Было бы полезно, если бы был способ сделать это без использования Имеющего счет () = 5;вообще, но автоматически возвращать в качестве вывода сущность, которая содержит все значения в условии IN *

Ответы [ 2 ]

0 голосов
/ 09 марта 2019

Попробуйте это

select semundjeName
from simptomat 
left join rel
on rel.semundjeID = simptomat.simptomaID
left join semundjet
on semundjet.semundjeID = rel.semundjeID
where simptomaName IN ('Merzi','Dhimbje Koke','Gjakederdhje','Dhimbje 
Fyti','Dhimbje Kycesh')
group by semundjeName
HAVING COUNT(*) = 5; 

и поместите весь фильтр simptomaName в таблицу, чтобы избежать =5

select semundjeName
from simptomat 
left join rel
on rel.semundjeID = simptomat.simptomaID
left join semundjet
on semundjet.semundjeID = rel.semundjeID
where simptomaName IN (select 'Merzi'
union select 'Dhimbje Koke'
union select 'Gjakederdhje'
union select 'Dhimbje Fyti'
union select 'Dhimbje Kycesh')
group by semundjeName
HAVING COUNT(*) = (select count(*) from (select 'Merzi'
union select 'Dhimbje Koke'
union select 'Gjakederdhje'
union select 'Dhimbje Fyti'
union select 'Dhimbje Kycesh') a); 

просто динамически создайте временную таблицу или сгенерируйте текст как

select 'Merzi'
union select 'Dhimbje Koke'
union select 'Gjakederdhje'
union select 'Dhimbje Fyti'
union select 'Dhimbje Kycesh')
0 голосов
/ 09 марта 2019

Изменение:

HAVING COUNT(*) = 5

до:

HAVING COUNT(DISTINCT simptomaName) = 5

потому что это то, что вы хотите посчитать, верно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...