简体   繁体   中英

SQL Oracle Query - Left Outer Join on null Field

I have this query

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 by itself returns 118 rows while the whole query returns 117, the reason is bml returns 1 row with baby_patient_id as null, so I used left outer join to show it, but it's still not showing !!

what can I do to show all rows of bml ?

I'm using Toad 9.6

Thank you

The probable cause is your filter / criteria (where clause) is eliminating a row with a null value for v.num. The WHERE filters the results after the join.

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

The mere action of using a criteria against a field, by definition of what NULL means, eliminates that row from consideration because NULL cannot be evaluated. You can say "WHERE id != 1" and expect to get rows where id is null because null != 1 right? Wrong. id != NULL is not defined logically. It is why we say "IS or IS NOT NULL" when dealing with NULL.

check the query:

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

does it return 118 not null patient_id's?

if it returns 117, that might be the reason.( LEFT OUTER JOIN doesnot pick the records which are null on both tables)

Also, are you sure the null value of baby_patient_id in bml table is actually a NULL value and not a empty charater?(' ').

it's working finally ! I added

      OR bml.baby_patient_id IS NULL 

to the where clause, so the final script is

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 

I don't know how this was helpful, I wish someone would explain for me ! Thanks all

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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