小编典典

如何改进此查询以避免使用嵌套视图?[关闭]

sql

查找拜访了与其保险公司关联的所有骨科医生(专科)的患者。

数据库: 单击此处以查看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;

阅读 139

收藏
2021-05-16

共1个答案

小编典典

熟悉您拥有的数据:

首先关键是要了解您拥有哪些数据。在这种情况下,您有四个表

  • 保险公司
  • 病人
  • 医生
  • 来访

你的目标:

查找所有拜访了与其保险公司关联的所有骨科医生(专科)的患者列表。

让我们退后一步,并对其进行较小的分析:

通常,从整体上看,这些要求可能会有些不知所措。让我们将需求分成较小的组件,以了解您需要做什么。

  1. A部分: 您需要找到专业为“骨科医生”的医生名单。
  2. b部分: 查找看过#1中确定的医生的患者名单。
  3. c部分: 筛选结果2,以查找共享同一保险公司的患者和医生的列表。
  4. d部分: 发现拜访了与患者属于同一保险公司的每位 骨科医师 的患者。

如何处理:

  1. 您需要确定您的主要目标,在这种情况下,您需要确定患者名单。因此,请先查询“患者”表。

  2. 您有患者,实际上是所有患者,但我们需要找到这些患者中的哪些去过医生。让我们不必担心医生是否是骨科医生。我们只需要患者名单和他们拜访过的医生即可。在Patient和Doctors表之间没有映射。要查找此信息,

在正确的关键字段上将“患者”表与“就诊”表连接起来。

然后将输出与Doctors表的正确键字段连接起来。

  1. 如果正确完成了连接,则现在应该具有所有拜访过的患者和医生的列表。如果您使用过LEFT OUTER JOIN,您甚至会发现从未看过医生的患者。如果您使用RIGHT OUTER JOIN,则只会找到去看医生的患者。

  2. 现在,您已经拜访了所有患者和医生。但是,要求是仅找到 骨科 医生。因此,应用条件对结果进行过滤以仅给出所需的结果。

  3. 现在,您已经达到了将需求分为 a 部分b 部分中 较小的组成 部分 的要求。您仍然需要由保险公司对其进行过滤。这是棘手的部分,该要求并不表示您需要显示保险公司,因此我们不必使用表InsuranceCompany。您的下一个问题将会'How am I going to filter the results?'。有效点。找出三个表中的任何一个PatientDoctorVisits包含保险公司信息。PatientDoctors有一个共同的领域。加入该公共字段以过滤结果。

  4. 查找每个患者曾拜访过的独特 骨科 医生的人数。

  5. 这是可以用多种方法完成的部分,其中一种方法是添加一个子查询,该子查询将成为输出中的第四列。此子查询将查询Doctors表,并按Specialty =’Orthopedist’进行过滤。除了该过滤器之外,您还必须通过将内部表上的保险公司与主查询上“患者”表上的保险公司ID进行匹配来进行过滤。此子查询将返回与患者数据匹配的保险公司ID的所有骨科医师的人数。

  6. 现在patient id,您应该具有子查询中的patient namepatients visits count和字段total number of Orthopedists in same insurance company。然后,您可以添加一个外部联接,该联接将在patients visits count与匹配 的字段上过滤此派生表中的结果total number of Orthopedists in same insurance company。我并不是说这是最好的方法。这是我能想到的一种方法。

  7. 如果遵循上述逻辑,则应具有此逻辑。

拜访过所有医生的患者名单

仅由骨科医生筛选

由患者和医生过滤,共享相同的保险公司信息。

同样,整个输出随后将通过派生表输出中找到的两个计数字段进行过滤。

球在你的球场上:

  • 逐步尝试,找到答案后。将其作为单独的答案发布在此处。我将对其进行投票,以弥补您在此问题上获得的所有反对。

我相信您可以轻松做到这一点。

如果你跌跌撞撞…

别犹豫将您的问题发布为comments to this answer,其他人,我将很高兴为您提供帮助。

免责声明

我提供了实现此逻辑的多种方法之一。我相信,有很多方法可以更好地实现这一目标。

结果:

请参考@Ofek Ron的答案以获取产生所需输出的正确查询。我没有写查询的任何部分。这是OP的全部努力。

2021-05-16