基本SQL查询帮助(不存在)

时间:2015-09-15 02:44:52

标签: sql not-exists

我有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');

有人可以向我解释我做错了什么吗?也许我的整个方法都不正确。

3 个答案:

答案 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

在这里小提琴:http://sqlfiddle.com/#!3/0e194/1

答案 2 :(得分:0)

你可以这样做:

colspan

通过这种方式,您可以选择最内部选择的指定城市的患者,然后您将患者访问的DoctorId选中,最后选择不在其中的医生。