繁体   English   中英

SQL Oracle查询-空字段上的左外部联接

[英]SQL Oracle Query - Left Outer Join on null Field

我有这个查询

SELECT   *
    FROM (SELECT mi.visit_id, mi.event_id, mi.patient_id, mi.mrn, mi.reg_date,
                 mi.d_date, mi.bml_count, mi.TYPE, mblp.baby_patient_id,
                 mblp.baby_birthdate
            FROM ajmid.km0076_motherinfo_test mi LEFT JOIN alfayezb2.mbl_patients mblp
                 ON mblp.mother_patient_id = mi.patient_id
                 --works here 
               AND (   TO_CHAR (mblp.baby_birthdate, 'mm/dd/YYYY') =
                                           TO_CHAR (mi.reg_date, 'mm/dd/YYYY')
                    OR TO_CHAR (mblp.baby_birthdate, 'mm/dd/YYYY') =
                                       TO_CHAR (mi.reg_date - 1, 'mm/dd/YYYY')
                    OR TO_CHAR (mblp.baby_birthdate, 'mm/dd/YYYY') =
                                       TO_CHAR (mi.reg_date + 1, 'mm/dd/YYYY')
                   )
                 ) bml
         LEFT OUTER JOIN --doesn't work here
         (SELECT ROW_NUMBER () OVER (PARTITION BY vis.patient_id ORDER BY vis.admission_date_time)
                                                                          num,
                 vis.admission_date_time, vis.visit_id, vis.patient_id,
                 vis.facility_id
            FROM visit vis) v ON bml.baby_patient_id = v.patient_id
   WHERE v.num = 1
ORDER BY bml.reg_date

bml本身返回118行,而整个查询返回117,原因是bml返回1行,并且baby_ Patient_id为null,因此我使用左外部联接来显示它,但是仍然没有显示!

如何显示bml的所有行?

我正在使用Toad 9.6

谢谢

可能的原因是您的过滤器/条件(where子句)正在消除v.num为空值的行。 加入后,WHERE会过滤结果。

 WHERE v.num = 1   -- Are all v.num equal to 1 ?

根据NULL的定义,仅对字段使用标准的操作就消除了该行,因为无法评估NULL。 您可以说“ WHERE id!= 1”,并期望得到id为null的行,因为null!= 1对吗? 错误。 id!= NULL在逻辑上未定义。 这就是为什么我们在处理NULL时说“ IS或IS NOT NULL”。

检查查询:

SELECT ROW_NUMBER () OVER (PARTITION BY vis.patient_id ORDER BY vis.admission_date_time)
                                                                          num,
                 vis.admission_date_time, vis.visit_id, vis.patient_id,
                 vis.facility_id
            FROM visit vis

它返回118不是null Patient_id的吗?

如果返回117,则可能是原因。( LEFT OUTER JOIN不会选择在两个表中都为空的记录)

另外,您确定bml表中baby_patient_id的null值实际上是NULL值而不是空字符吗?('')。

终于工作了! 我加了

      OR bml.baby_patient_id IS NULL 

到where子句,所以最终脚本是

SELECT   *
FROM (SELECT mi.visit_id, mi.event_id, mi.patient_id, mi.mrn, mi.reg_date,
             mi.d_date, mi.bml_count, mi.TYPE, mblp.baby_patient_id,
             mblp.baby_birthdate
        FROM ajmid.km0076_motherinfo_test mi LEFT JOIN alfayezb2.mbl_patients mblp
             ON mblp.mother_patient_id = mi.patient_id
           AND (   TO_CHAR (mblp.baby_birthdate, 'mm/dd/YYYY') =
                                       TO_CHAR (mi.reg_date, 'mm/dd/YYYY')
                OR TO_CHAR (mblp.baby_birthdate, 'mm/dd/YYYY') =
                                   TO_CHAR (mi.reg_date - 1, 'mm/dd/YYYY')
                OR TO_CHAR (mblp.baby_birthdate, 'mm/dd/YYYY') =
                                   TO_CHAR (mi.reg_date + 1, 'mm/dd/YYYY')
               )
             ) bml
     LEFT OUTER JOIN
     (SELECT ROW_NUMBER () OVER (PARTITION BY vis.patient_id ORDER BY vis.admission_date_time)
                                                                      num,
             vis.admission_date_time, vis.visit_id, vis.patient_id,
             vis.facility_id
        FROM visit vis) v ON bml.baby_patient_id = v.patient_id
    WHERE v.num = 1
      OR bml.baby_patient_id IS NULL
    ORDER BY bml.reg_date 

我不知道这有什么帮助,我希望有人能帮我解释一下! 谢谢大家

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM