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

Ofe*_*Ron -4 mysql 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;
Run Code Online (Sandbox Code Playgroud)

我怎么能在一个查询上写它?

尝试:

到目前为止,我试图解决这个问题.

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;
Run Code Online (Sandbox Code Playgroud)

小智 11

熟悉您拥有的数据:

第一个关键是要了解您拥有的数据.在这种情况下,您有四个表

  • 保险公司
  • 患者
  • 医生
  • 访问

你的目标:

查找访问与其保险公司相关的所有骨科医生(专科)的所有患者的列表.

让我们退后一步,分析一下:

一般来说,当你整体看它们时,要求可能有点压倒性.让我们将需求分成更小的组件,以了解您需要做什么.

  1. 第一部分:你需要找到医生名单,其专长是'骨科医生'
  2. 第二部分:找到访问#1中确定的医生的患者名单.
  3. c部分:过滤结果#2,找到共享同一保险公司的患者和医生名单.
  4. 第四部分:找出那些访问过每一位与患者属于同一保险公司的骨科医生的患者.

如何处理:

  1. 您需要确定您的主要目标,在这种情况下,以确定患者列表.因此,首先查询Patient表.

  2. 你有患者,实际上所有患者,但我们需要找到哪些患者去看医生.我们不担心医生是否是骨科医生.我们只需要患者名单和他们访问过的医生.患者和医生表之间没有映射.要了解这些信息,

    使用正确的关键字段上的Visits表加入Patient表.

    然后将输出与Doctors表连接到正确的键字段.

  3. 如果您已正确完成连接,您现在应该拥有所有患者和他们访问过的医生的列表.如果您使用过LEFT OUTER JOIN,您甚至会发现从未去过医生的患者.如果您使用过RIGHT OUTER JOIN,您将只找到去看医生的患者.

  4. 现在,您有所有患者和他们访问过的医生.但是,要求只找到骨科医生.因此,应用条件过滤结果只给出所需的结果.

  5. 您现在已经达到了要求,即在a 部分b 部分中分成较小的组件.您仍然需要由保险公司过滤它.这里是棘手的部分,要求并不是说你需要展示保险公司,所以我们不必使用表保险公司.你的下一个问题是'How am I going to filter the results?'.有效点.找出三个表中是否有任何一个Patient,DoctorVisits包含保险公司信息.PatientDoctors有一个共同的领域.加入该公共字段以过滤结果.

  6. 找出每位患者访问过的独特骨科医生的数量.

  7. 以下是可以通过多种方式完成的部分,其中一种方法是添加一个子查询,该查询将是输出中的第四列.该子查询将查询表Doctors并按special ='Orthopedist'过滤.除了该过滤器之外,您还必须通过将内部表上的保险公司与主查询上的患者表上的保险公司ID进行匹配来进行过滤.该子查询将返回与患者数据匹配的保险公司ID的所有骨科医生的计数.

  8. 你现在应该有田野patient id,patient name,patients visits counttotal number of Orthopedists in same insurance company从子查询.然后,您可以添加外部联接,该联接将在patients visits count与其匹配 的字段上筛选此派生表的结果total number of Orthopedists in same insurance company.我不是说这是最好的方法.这是我能想到的一种方法.

  9. 如果你遵循上面的逻辑,你应该有这个.

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

仅由医生过滤,他们是骨科医生

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

同样,整个输出然后由派生表输出中找到的两个计数字段过滤.

球在你的球场:

  • 一旦找到答案,一步一步尝试.将其作为单独的答案发布在此处.我会赞成它来弥补你在这个问题上得到的所有挫折.

我相信你可以轻松地做到这一点.

如果你绊倒......

不要犹豫将您的问题发布为comments to this answer,其他人和我将很乐意为您提供帮助.

放弃

我已经提供了如何实现这种逻辑的众多方法之一.我确信有很多方法可以更好地实现这一点.

结果:

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