我有3张医生,患者和就诊表。
Doctor Table有DoctorID,Name和City。
患者表具有PatientID,姓名和城市。
访问表有DoctorID,PatientID,NumVisits。
我正在试图找回所有未被某个城市的病人访问的医生(让我们说纽约)。
我在撰写查询方面非常陌生,我似乎无法让它发挥作用。
我的代码:
SELECT DoctorId,
Doctor.Name
FROM Visit
JOIN Doctor using(DoctorID)
JOIN Patient using(PatientID)
WHERE NOT EXISTS
(SELECT DoctorId,
Doctor.Name
FROM Visit
JOIN Doctor using(DoctorID)
JOIN Patient using(PatientID)
WHERE Patient.City = 'New York');
有人可以向我解释我做错了什么吗?也许我的整个方法都不正确。
答案 0 :(得分:1)
您应该将子查询与主查询连接起来。
现在你的子查询中你选择了纽约的所有医生,当然你至少有一个。
这就是WHERE NOT EXISTS (1 or more rows)
永远不会成真的原因。
试试这样的事情
SELECT DoctorId,
Doctor.Name
FROM Visit
JOIN Doctor using(DoctorID)
JOIN Patient using(PatientID)
WHERE NOT EXISTS
(SELECT *
FROM Visit
JOIN Patient using(PatientID)
WHERE Patient.City = 'New York')
and Visit.Doctorid=Doctor.DoctorID -- Doctor.DoctorID from main query
;
并且(感谢@Brad): 由于患者未在外部查询中使用,因此您可以删除针对患者和访问的第一个JOIN。事实上,您应该在外部查询中删除针对患者和访问的联接,否则您将错过没有患者的医生的记录。 结果将是
SELECT DoctorId,
Doctor.Name
FROM Doctor
WHERE NOT EXISTS
(SELECT *
FROM Visit
JOIN Patient using(PatientID)
WHERE Patient.City = 'New York')
and Visit.Doctorid=Doctor.DoctorID -- Doctor.DoctorID from main query
;
答案 1 :(得分:1)
SELECT DISTINCT D.DOCTORID
FROM Visit V
INNER JOIN PATIENT P ON P.PATIENTID = V.PATIENTID AND P.CITY='NEWYORK'
RIGHT JOIN DOCTOR D ON D.DOCTORID = V.DOCTORID
WHERE P.PATIENTID IS NULL
答案 2 :(得分:0)
你可以这样做:
colspan
通过这种方式,您可以选择最内部选择的指定城市的患者,然后您将患者访问的DoctorId选中,最后选择不在其中的医生。