检查特定时间范围内2个表中是否存在值?

时间:2016-02-02 13:57:33

标签: sql database

我需要以某种方式获得在这两个表中以任意组合具有[约会日期]的患者列表。 (例如,自2015年11月1日至今,可以在表A中出现两次,或表A和B,或表B两次)。

真的很难对付这个,所以任何帮助都会非常感激!

患者表A
PatientID,约会日期,测试,等等,等等

患者表B
PatientID,约会日期,等等等等。

我认为我最喜欢的是如果可能的话,从两个表中返回所有行?理想输出看起来像

PatientID, Appointment Date, Age, Gender, Location 
86677, 23-11-2015, Age 74, Male, UK
86677, 03-12-2015, Age 74, Male, UK 

此外,如果表A是门诊病人且表B是住院病人,我如何添加额外的列来帮助识别?例如,如果上面的例子在2015年11月23日有一个住院病人预约,而在2015年12月3日有一个门诊病人,我怎么能在我的输出中识别2?

2 个答案:

答案 0 :(得分:0)

这可能最终会很慢,但基本逻辑是:

  SELECT patient_id 
    FROM (       
      SELECT patient_id
        FROM table_a
       WHERE appointment_date >= '2015-11-01'       
   UNION ALL
      SELECT patient_id
        FROM table_b
       WHERE appointment_date >= '2015-11-01'
         ) combined
GROUP BY patient_id
  HAVING COUNT(*) >= 2 

通过分解组合可以获得更好的表现:

  SELECT patient_id
    FROM table_a
   WHERE appointment_date >= '2015-11-01'
GROUP BY patient_id
  HAVING COUNT(*) >= 2 
   UNION 
  SELECT patient_id
    FROM table_b
   WHERE appointment_date >= '2015-11-01'
GROUP BY patient_id
  HAVING COUNT(*) >= 2 
   UNION
  SELECT a.publisher_id
    FROM table_a a
    JOIN table_b b
      ON b.patient_id = a.patient_id 
     AND b.appointment_date >= '2015-11-01'
   WHERE a.appointment_date >= '2015-11-01'

答案 1 :(得分:0)

此解决方案在设计时考虑了SQL服务器,尽管它可以与其他一些方言一起使用。基本思想是将两个表与新属性(住院病人/门诊病人)组合成一个虚拟表,您可以在以下查询中调用该表。这被称为公用表表达式(CTE)。

CTE创建一个组合表,然后您可以执行一些检查。我们在CTE中执行日期检查,但是在我们组合表之后,为了避免重复日期过滤器。当我们调用CTE时,我们会让它返回组合表中有2个或更多记录的患者的PatientID列表。我们使用该列表作为WHERE中的过滤器,从同一列表中选择那些患者的所有记录。

WITH combo AS
( SELECT
    *
  FROM
    ( SELECT
          PatientID
        , Appointment_Date
        , Age
        , Gender
        , Location
        , 'Inpatient'  Record_Source
      FROM
        TableB

      UNION ALL /* UNION drops duplicates; need UNION ALL */

      SELECT
          PatientID
        , Appointment_Date
        , Age
        , Gender
        , Location
        , 'Outpatient'  Record_Source
      FROM
        TableB
    ) sub
  WHERE  /* Filter date after union to be DRY programming */
    Appointment_Date >= '2015-11-01'
)

SELECT
  *
FROM
  combo
WHERE
  PatientID IN
    ( SELECT PatientID
      FROM combo
      GROUP BY PatientID
      HAVING count(*) >= 2
    )
相关问题