查找拜访了与其保险公司关联的所有骨科医生(专科)的患者。
数据库: 单击此处以查看SQL Fiddle中的示例数据脚本。
CREATE VIEW Orthos AS SELECT d.cid,d.did FROM Doctors d WHERE d.speciality='Orthopedist'; CREATE VIEW OrthosPerInc AS SELECT o.cid, COUNT(o.did) as countd4i FROM Orthos o GROUP BY o.cid; CREATE VIEW OrthoVisitsPerPat AS SELECT v.pid,COUNT(o.did) as countv4d FROM Orthos o,Visits v,Doctors d WHERE o.did=v.did and d.did=o.did GROUP BY v.pid,d.cid; SELECT p.pname,p.pid,p.cid FROM OrthoVisitsPerPat v, OrthosPerInc i,Patient p WHERE i.countd4i = v.countv4d and p.pid=v.pid and p.cid=i.cid; DROP VIEW IF EXISTS Orthos,OrthosPerInc,OrthoVisitsPerPat;
如何在一个查询中写它?
到目前为止,这是我要解决的尝试。
SELECT p.pid,p.pname,p.cid,COUNT(v.did) FROM Visits v JOIN Doctors d ON v.did=d.did JOIN Patient p ON p.pid=v.pid WHERE d.cid=p.cid and d.speciality="Orthopedist" GROUP BY p.pid,p.cid; INTERSECT SELECT p.pid,d.cid,COUNT(d.did) FROM Doctors d JOIN Patient p ON p.cid=d.cid WHERE d.speciality='Orthopedist' GROUP BY d.cid;
首先关键是要了解您拥有哪些数据。在这种情况下,您有四个表
查找所有拜访了与其保险公司关联的所有骨科医生(专科)的患者列表。
通常,从整体上看,这些要求可能会有些不知所措。让我们将需求分成较小的组件,以了解您需要做什么。
您需要确定您的主要目标,在这种情况下,您需要确定患者名单。因此,请先查询“患者”表。
您有患者,实际上是所有患者,但我们需要找到这些患者中的哪些去过医生。让我们不必担心医生是否是骨科医生。我们只需要患者名单和他们拜访过的医生即可。在Patient和Doctors表之间没有映射。要查找此信息,
在正确的关键字段上将“患者”表与“就诊”表连接起来。
然后将输出与Doctors表的正确键字段连接起来。
如果正确完成了连接,则现在应该具有所有拜访过的患者和医生的列表。如果您使用过LEFT OUTER JOIN,您甚至会发现从未看过医生的患者。如果您使用RIGHT OUTER JOIN,则只会找到去看医生的患者。
LEFT OUTER JOIN
RIGHT OUTER JOIN
现在,您已经拜访了所有患者和医生。但是,要求是仅找到 骨科 医生。因此,应用条件对结果进行过滤以仅给出所需的结果。
现在,您已经达到了将需求分为 a 部分 和 b 部分中 较小的组成 部分 的要求。您仍然需要由保险公司对其进行过滤。这是棘手的部分,该要求并不表示您需要显示保险公司,因此我们不必使用表InsuranceCompany。您的下一个问题将会'How am I going to filter the results?'。有效点。找出三个表中的任何一个Patient,Doctor并Visits包含保险公司信息。Patient并Doctors有一个共同的领域。加入该公共字段以过滤结果。
'How am I going to filter the results?'
Patient
Doctor
Visits
Doctors
查找每个患者曾拜访过的独特 骨科 医生的人数。
这是可以用多种方法完成的部分,其中一种方法是添加一个子查询,该子查询将成为输出中的第四列。此子查询将查询Doctors表,并按Specialty =’Orthopedist’进行过滤。除了该过滤器之外,您还必须通过将内部表上的保险公司与主查询上“患者”表上的保险公司ID进行匹配来进行过滤。此子查询将返回与患者数据匹配的保险公司ID的所有骨科医师的人数。
现在patient id,您应该具有子查询中的patient name,patients visits count和字段total number of Orthopedists in same insurance company。然后,您可以添加一个外部联接,该联接将在patients visits count与匹配 的字段上过滤此派生表中的结果total number of Orthopedists in same insurance company。我并不是说这是最好的方法。这是我能想到的一种方法。
patient id
patient name
patients visits count
total number of Orthopedists in same insurance company
如果遵循上述逻辑,则应具有此逻辑。
拜访过所有医生的患者名单
仅由骨科医生筛选
由患者和医生过滤,共享相同的保险公司信息。
同样,整个输出随后将通过派生表输出中找到的两个计数字段进行过滤。
我相信您可以轻松做到这一点。
别犹豫将您的问题发布为comments to this answer,其他人,我将很高兴为您提供帮助。
comments to this answer
我提供了实现此逻辑的多种方法之一。我相信,有很多方法可以更好地实现这一目标。
请参考@Ofek Ron的答案以获取产生所需输出的正确查询。我没有写查询的任何部分。这是OP的全部努力。