表之间的交叉记录

时间:2013-01-11 23:25:52

标签: sql oracle

我有这个问题:

select pa.id,pa.name 
from patients pa 
where (select count(distinct co.doctorID) 
       from consults co 
       where co.patientID=pa.id) = (select count(do.id) 
                                    from doctors do);

我选择与所有医生协商的患者。

我正在计算不同医生的数量,看看是否等于医生总数。

但如何使用exists和/或in而不使用计数

来执行此操作

2 个答案:

答案 0 :(得分:2)

您可以使用嵌套的NOT EXISTS

select pa.id,pa.name 
from patients pa 
where NOT EXISTS
(
   select 1 FROM doctors do
   where NOT EXISTS
   (
      SELECT 1 FROM consults co
      WHERE co.doctorID=do.id
      AND pa.id=co.patientID
   )
)

换句话说,选择没有咨询医生的所有患者。至少它应该给你这个想法。

答案 1 :(得分:1)

我认为您可以使用NOT EXISTS尝试更好的解决方案,根本不需要计数:

SELCT pa.id,pa.name 
FROM patients pa 
WHERE NOT EXISTS (SELECT *  
                  FROM doctors do 
                       LEFT JOIN consults co  
                             ON co.doctorID ON do.id
                  WHERE co.patientID=pa.id 
                      AND co.doctorID IS NULL

    )

在子查询中,我们得到所有医生,看看他们是否都咨询了当前患者。如果co.doctorID为NULL,则患者不会访问该医生。