2014-11-13 1 views
-1

SQL 내부 조인에 문제가 있습니다. 다음 그림에서 내 테이블, 열, 데이터 형식 및 테이블 값.SQL 내부 조인 LEFT OUTER JOIN 같은 조인 쿼리

SELECT O.ORDER_ID, O.ORDER_DATE, O.QUANTITY, 
    P.PART_ID, P.PART_CODE, P.PART_NAME, 
    C.CUST_ID, C.CUST_CODE, C.CUST_NAME 
FROM (([dbo].[ORDER] O 
LEFT OUTER JOIN [dbo].[CUSTOMER] C 
    ON C.CUST_ID = O.CUST_ID) 
LEFT OUTER JOIN [dbo].[PART] P 
    ON P.PART_ID = O.PART_ID 

enter image description here

그래서 내 질문에, 나는 두 번째 이미지 같은 쿼리를 작성하려는 것을 반환하지만 을 수행해야합니다

enter image description here

내 작업 쿼리입니다 INNER JOIN을 사용하면 왼쪽 외부 조인 작업이 수행됩니다. 나는이

SELECT DISTINCT * 
FROM [dbo].[ORDER] O 
INNER JOIN CUSTOMER C 
    ON (C.CUST_ID = O.CUST_ID OR 
     O.CUST_ID IS NULL) 

에 대해 다음 쿼리를 작성하지만 LEFT OUTER 나에게 쿼리 결과를 가입 반환하지 않습니다. 어떻게하면됩니까 LEFT OUTER JOIN?

답변

0

교사의 의도에 따라 다릅니다. 이 언어 문제, 그리고 논리 연산자 질문의 경우, OUTER APPLY를 사용

SELECT O.*, D.* 
FROM [dbo].[ORDER] O 
OUTER APPLY 
(
    SELECT * 
    FROM [dbo].CUSTOMER C 
    WHERE C.CUST_ID = O.CUST_ID 
) D 
1

간단한 대답은 다음과 같습니다. 왼쪽 결합을 쉽게 내부 결합으로 바꾸고 동일한 기능을 유지할 수 없습니다. (그리고 왜?)

왼쪽 외부 조인을 사용하면 두 번째 테이블에 일치 항목이없는 경우에도 두 번째 테이블에 조인 할 수 있지만 두 번째 테이블에는 일치 번호이있는 경우에도 첫 번째 테이블 레코드를 유지할 수 있습니다. 반면에 내부 조인은 만 일치하는과 같은 첫 번째 테이블의 레코드를 제한합니다.

INNER JOIN CUSTOMER C ON (C.CUST_ID = O.CUST_ID OR O.CUST_ID IS NULL) 

은 여기 부분적으로 테이블 고객을 가입 할 수 있습니다. 주. 테이블에 고객이 들어 있으면, 고객 레코드를 주. 레코드에 조인합니다. 주. 표에 고객이 포함되어 있지 않으면 모든 고객을 주.

물론 당신은 항상 속일 수 있습니다. 즉시 널 기록을 추가

INNER JOIN 
(
    SELECT CUST_ID, CUST_CODE, CUST_NAME 
    FROM CUSTOMER 
    UNION ALL 
    SELECT NULL, NULL, NULL 
) C ON (C.CUST_ID = O.CUST_ID OR (C.CUST_ID IS NULL AND O.CUST_ID IS NULL)) 

그러나 같은

말했다 : 왜 당신이 할 것 대신 LEFT OUTER JOIN을 사용하는 스트레이트 포워드 방식을 사용?

+0

내가 작품에 참여하는 방법을 왼쪽 외부 알고 있지만 선생님은 "내부 조인 또는 다른 통해 당신은 외부의 참여 작업을 왼쪽으로 할 수있는 방법 왼쪽의 외부 결합을 사용하지 마십시오. " – okarakose

+0

흠, 글쎄, 내 의견으로는 이상한 일이다. 그러나 당신은 해결책을 가지고 있습니다 ;-) 외부 조인을 대체하는 또 다른 방법은 두 개의 select와 UNION이 될 것입니다. x에서 xa, yb 선택 x.id = y.id에 join y UNION ALL select a, null from x 여기서 id는 null입니다. 어쩌면 선생님이 찾고있는 것일 수도 있습니다. –