2014-05-14 1 views
0

에 가입 내가 전체 쿼리 (117)를 반환하면서 그 자체로 BML 118 개 행을 반환SQL - 왼쪽 외부가 null 필드

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 

이 쿼리를 가지고, 그 이유는 널 (null)로 baby_patient_id 1 행은 그래서, BML 반환을이다 나는 그것을 보여주기 위해 왼쪽 외부 조인을 사용했다. 그러나 그것은 아직도 보이지 않고있다!

bml의 모든 행을 표시하려면 어떻게해야합니까? 내가

두꺼비 9.6를 사용하고

는 가능한 원인은 필터/기준 (WHERE 절) v.num에 대한 null 값이있는 행을 제거한다 당신

답변

0

감사드립니다. WHERE는 결합 후에 결과를 필터링합니다. NULL이 평가 될 수 없기 때문에

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

무엇 NULL 수단의 정의에 의해, 필드에 대해 기준을 사용하는 단순한 동작은 고려 대상에서 해당 행을 제거합니다. "WHERE id! = 1"라고 말할 수 있고 null! = 1이므로 id가 null 인 행을 가져올 것으로 예상 할 수 있습니까? 잘못된. id! = NULL이 논리적으로 정의되지 않았습니다. 우리가 NULL을 다룰 때 "IS 또는 IS NOT NULL"이라고 말하는 이유입니다.

+0

v.num은 파티션 요소이므로 방문 테이블에서 첫 번째 방문을 받아야합니다. 표시하고자하는 레코드에는 mbl_patients 및 방문에 대한 데이터가 포함되어 있지 않지만 데이터를 표시 할 수있었습니다. 그럼에도 불구하고 bml 내부 쿼리에 표시하기 위해 동일한 기법 (LEFT JOIN)을 사용했지만 전체 쿼리에 대해 표시되지 않습니다. – user1495987

+0

그런 다음 외부 쿼리에서 NVL (v.num, 1)을 사용해야 할 수도 있습니다. where 절은 널 (null)로 행을 필터링 (제거)합니다. – codenheim

+0

조건을 제거하려고 시도했지만 (여전히 필요한 경우) 레코드가 표시되지 않습니다! – user1495987

0

체크 쿼리 :

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 NOT NULL patient_id 년대를 반환합니까? 이 117을 반환하는 경우

, 그 이유가 될 수 있습니다. 또한

(LEFT OUTER JOIN doesnot 두 테이블에 null 인 레코드를 선택), 확실 bml 테이블에 baby_patient_id의 null 값이 실제로 NULL 값입니다 빈 채터가 아닌가? ('').

+0

분할 된 테이블 방문이 118을 초과하여 반환됩니다! 다른 한편으로는 bml.baby_patient_id를 ''와 같이 추가하려고 시도했지만 작동하지 않았습니다! – user1495987

0

마침내 작동 중입니다! 나는 누군가가 나를 위해 설명 텐데, 나는 where 절에

 OR bml.baby_patient_id IS NULL 

을 추가, 그래서 최종 스크립트는

이 도움이 얼마나 모르겠어요
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 

입니다! 감사합니다 모두