복붙노트

[SQL] 왼쪽 외부가 작동하지 않는다 가입?

SQL

왼쪽 외부가 작동하지 않는다 가입?

나는 쿼리가 모두 조인 LEFT OUTER JOIN을 사용하여 세 개의 테이블에서 데이터를 끌어 있습니다. 나는이 (각각 처방 및 처방) 오른쪽 두 테이블에 해당하는 데이터가없는 경우에도 가장 왼쪽 (영업 담당자 테이블) 정보를 반환하는 쿼리를해야합니다. 나는 WHERE 절에 날짜 매개 변수없이이 쿼리를 실행하면, 나는 기대 수익을 얻을,하지만 난 날짜 매개 변수를 포함 자마자 나는 영업 담당자에 대한 일치하는 데이터가없는 경우 아무 것도 반환되지 얻을. 적어도 쿼리에서 요청 된 영업 담당자 테이블 컬럼을 볼에 나는이 필요합니다.

다음 쿼리는 ... 어떤 도움이 아주 많이 감사합니다.

SELECT  salesrep.salesrepid as SalesRepID,
        salesrep.fname as SalesrepFName,
        salesrep.lname as SalesRepLName,
        salesrep.fname+' '+salesrep.lname as SalesRepFullName,
        prescriber.dea_no as PDeaNo,
        prescriber.lname+', '+prescriber.fname as DocName,
        CONVERT(VARCHAR(8), prescriptions.filldate, 1) as FillDate,
        prescriptions.drugname as DrugName,
        prescriptions.daysupply as Supply,
        prescriptions.qtydisp as QtyDisp,
        prescriptions.rx_no as Refill,
        prescriptions.copay as Sample,
        ROUND(prescriptions.AgreedToPay-(prescriptions.AgreedToPay*.07),2) as AgreedToPay,
        prescriptions.carrierid as CarrierID
FROM    salesrep
  LEFT OUTER JOIN prescriber on salesrep.salesrepid = prescriber.salesrepid
  LEFT OUTER JOIN prescriptions on prescriber.dea_no = prescriptions.dea_no
  WHERE salesrep.salesrepid = 143 AND
        prescriptions.filldate >= '09-01-12' AND
        prescriptions.filldate <= '09-17-12'
ORDER BY prescriptions.filldate

해결법

  1. ==============================

    1.당신은 조인의 ON 상태로 prescriptions.filldate에 대한 제약을 이동하고 where 절에서 제거해야합니다 :

    당신은 조인의 ON 상태로 prescriptions.filldate에 대한 제약을 이동하고 where 절에서 제거해야합니다 :

    LEFT OUTER JOIN prescriptions ON prescriber.dea_no = prescriptions.dea_no
                                 AND prescriptions.filldate >= '09-01-12'
                                 AND prescriptions.filldate <= '09-17-12'
    

    그렇지 않으면, 어떤 처방이없는있는 항목은 prescriptions.filldate에서 null로 끝낼하고 WHERE 절을 버린다.

  2. ==============================

    2.여기서 당신은 쿼리 처리 단계 (대부분의 DBMS에 대한 그것의 일반적인)에 대한 간단한 설명을 찾을 수 있습니다. 당신은 거기 찾을 수 OUTER에 대한 그 가입 :

    여기서 당신은 쿼리 처리 단계 (대부분의 DBMS에 대한 그것의 일반적인)에 대한 간단한 설명을 찾을 수 있습니다. 당신은 거기 찾을 수 OUTER에 대한 그 가입 :

    당신은 그들이 모두 폐기하고 외부 테이블 행을 접촉 WHERE 절에서 조건을 배치 할 때. 외부 행이 추가되기 전에 그 사람이 평가 될 때 당신은 단순히, ON 절에서 해당 조건을 배치해야합니다.

    따라서, 이러한 조건 :

    prescriptions.filldate >= '09-01-12' AND
    prescriptions.filldate <= '09-17-12'
    

    ON 절에 이동해야합니다.

  3. ==============================

    3.당신의 prescriptions.filldate 불평등이 prescriptions.filldate 컬럼에 값이없는 당신의 영업 담당자 행을 필터링되기 때문입니다.

    당신의 prescriptions.filldate 불평등이 prescriptions.filldate 컬럼에 값이없는 당신의 영업 담당자 행을 필터링되기 때문입니다.

    그래서 널 (null) 값 (오른쪽 테이블에서 일치하는 데이터), 날짜 필터에 의해 필터링 된 영업 담당자 데이터를 포함 다음 전체 행이있는 경우 - 널이 두 날짜 사이에 해당하지 않기 때문에.

  4. ==============================

    4.이 바이올린는 것을 설명하기 위해 유용 할 수 있습니다 :

    이 바이올린는 것을 설명하기 위해 유용 할 수 있습니다 :

    내부에 문제가되지 않습니다 조인하지만, 외부 조인으로 많이 중요. 문서에서 자세한 내용

    테이블 T1

    | num | name |
    | --- | ---- |
    | 1   | a    |
    | 2   | b    |
    | 3   | c    |
    

    테이블 T2

    | num | value |
    | --- | ----- |
    | 1   | xxx   |
    | 3   | yyy   |
    | 5   | zzz   |
    

    ON 절에 조인 조건

    SELECT * FROM t1 
    LEFT JOIN t2 ON t1.num = t2.num AND t2.value = 'xxx';
    
    | num | name | num | value |
    | --- | ---- | --- | ----- |
    | 1   | a    | 1   | xxx   |
    | 2   | b    |     |       |
    | 3   | c    |     |       |
    

    WHERE 절에 조인 조건

    SELECT * FROM t1 
    LEFT JOIN t2 ON t1.num = t2.num 
    WHERE t2.value = 'xxx';
    
    | num | name | num | value |
    | --- | ---- | --- | ----- |
    | 1   | a    | 1   | xxx   |
    

    DB 바이올린에보기

  5. from https://stackoverflow.com/questions/12467744/left-outer-join-not-working by cc-by-sa and MIT license