[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.당신은 조인의 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.여기서 당신은 쿼리 처리 단계 (대부분의 DBMS에 대한 그것의 일반적인)에 대한 간단한 설명을 찾을 수 있습니다. 당신은 거기 찾을 수 OUTER에 대한 그 가입 :
여기서 당신은 쿼리 처리 단계 (대부분의 DBMS에 대한 그것의 일반적인)에 대한 간단한 설명을 찾을 수 있습니다. 당신은 거기 찾을 수 OUTER에 대한 그 가입 :
당신은 그들이 모두 폐기하고 외부 테이블 행을 접촉 WHERE 절에서 조건을 배치 할 때. 외부 행이 추가되기 전에 그 사람이 평가 될 때 당신은 단순히, ON 절에서 해당 조건을 배치해야합니다.
따라서, 이러한 조건 :
prescriptions.filldate >= '09-01-12' AND prescriptions.filldate <= '09-17-12'
ON 절에 이동해야합니다.
-
==============================
3.당신의 prescriptions.filldate 불평등이 prescriptions.filldate 컬럼에 값이없는 당신의 영업 담당자 행을 필터링되기 때문입니다.
당신의 prescriptions.filldate 불평등이 prescriptions.filldate 컬럼에 값이없는 당신의 영업 담당자 행을 필터링되기 때문입니다.
그래서 널 (null) 값 (오른쪽 테이블에서 일치하는 데이터), 날짜 필터에 의해 필터링 된 영업 담당자 데이터를 포함 다음 전체 행이있는 경우 - 널이 두 날짜 사이에 해당하지 않기 때문에.
-
==============================
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 바이올린에보기
from https://stackoverflow.com/questions/12467744/left-outer-join-not-working by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 저장 프로 시저 파라미터리스트의 발현 (예를 들면 함수 호출)의 결과를 이용? (0) | 2020.03.29 |
---|---|
[SQL] 어떻게 필드의 고유 항목 Access 쿼리에서 계산합니까? (0) | 2020.03.29 |
[SQL] 삭제 중복 행 (모든 중복을 삭제하지 마십시오) (0) | 2020.03.29 |
[SQL] 자바 날짜 - 데이터베이스에 삽입 (0) | 2020.03.29 |
[SQL] 구문 분석 쉼표로 구분 된 문자열은 Where 절에서 문자열의 IN 목록을 만들려면 (0) | 2020.03.29 |