我具有基本的SQL知识,并且尝试编写以下问题的SQL语句:
Q:列出所有具有麻疹免疫力的学生[在此处输入图像描述] [1],但对水痘有宗教豁免。
我所拥有的:
宗教豁免
dragend
患有麻疹疫苗的人
clientY
我不确定如何将两者结合以获得单个结果。
附加的是数据库的逻辑模型。
[1]:https://i.stack.imgur.com/UQGqC.png
答案 0 :(得分:0)
如果要将代码保留在上面,则可以扩展JOIN和WHERE条件
SELECT DISTINCT(P.personID)
FROM Person P
INNER JOIN Waiver ON Person.personID = Waiver.personID
INNER JOIN WavierDisease On Waiver.waiverID = WaiverDisease.waiverID
INNER JOIN Disease ON WaiverDisease.diseaseID = Disease.diseaseID
INNER JOIN Immunity ON Person.personID = Immunity.personID -- add this
WHERE
Disease.diseaseName = ‘Chickenpox’
AND Waiver.exemptCode = ‘Religious’
AND Immunity.diseaseId IN ( -- add this
SELECT diseaseId FROM Disease WHERE Disease.diseaseName = 'Measles'
)
答案 1 :(得分:0)
要有效回答问题,
Q:列出所有具有麻疹免疫力但对水痘有宗教豁免的学生。
您需要查询两个条件:1)麻疹免疫力和2)水痘(或水痘)的宗教豁免。
因此,考虑将JOIN
添加为另一个Disease
,并第二次联接到SELECT P.*
FROM Person p
INNER JOIN Waiver w --- WAIVER CHECK
ON w.personID AND p.personID
AND w.exemptCode = 'Religious'
INNER JOIN WavierDisease wd
ON wd.waiverID = w.waiverID
INNER JOIN Disease d1
ON d1.diseaseID = wd.diseaseID
AND d1.diseaseName = 'Chickenpox'
INNER JOIN Immunity i --- IMMUNITY CHECK
ON i.personID AND p.personID
INNER JOIN Disease d2
ON d2.diseaseID = i.diseaseID
AND d2.diseaseName = 'Measles'
表中:
make_token
答案 2 :(得分:0)
列出所有拥有...的学生
WHERE ...
。而且,由于该信息位于其他表中,因此您需要EXISTS
或IN
。如果我正确理解了您的数据模型,这将为我们带来帮助:
select *
from person
where personid in
(
select personid
from immunity
where diseaseid = (select diseaseid from disease where diseaseName = 'Measles')
)
and personid in
(
select personid
from waiver
where exemptCode = 'Religious'
and waiverid in
(
select waiverid
from waiverdisease
where diseaseid = (select diseaseid from disease where diseaseName = 'Chickenpox')
)
);
我认为这是可读的。而且由于使用IN
而不是联接,因此我们确保不要在查找中得到任何重复项。
答案 3 :(得分:-1)
您可以使用union
SELECT *
FROM Person P
INNER JOIN Waiver ON Person.personID = Waiver.personID
INNER JOIN WavierDisease On Waiver.waiverID = WaiverDisease.waiverID
INNER JOIN Disease ON WaiverDisease.diseaseID = Disease.diseaseID
WHERE Disease.diseaseName = ‘Chickenpox’
AND Waiver.exemptCode = ‘Religious’
union
SELECT *
FROM Immunity I
INNER JOIN Disease ON I.diseaseID = Disease.diseaseID
WHERE Disease.diseaseName = 'Measles';
答案 4 :(得分:-1)
我让它起作用。感谢您的快速帮助。
SELECT Immunity.personID
FROM Immunity
INNER JOIN Disease ON Immunity.diseaseID = Disease.diseaseID
WHERE Disease.diseaseName = 'Measles'
UNION
SELECT Person.personID
FROM Person
INNER JOIN Waiver ON Person.personID = Waiver.personID
INNER JOIN WaiverDisease On Waiver.waiverID = WaiverDisease.waiverID
INNER JOIN Disease ON WaiverDisease.disease = Disease.diseaseID
WHERE Disease.diseaseName = 'Chickenpox'
AND Waiver.exemptTypeCode = 'Religious';