2016-06-02 2 views
1
SELECT a.org, 
      a.id, 
      a.Name, 
      b.ordNum 
     FROM customers A, 
      orders B 
    WHERE a.org = 'JJJ' 
     AND a.org = b.org (+) 
     AND b.addr_type (+) = 'ST' -- <<<<<<<<<<<<<<<<< why do i need to add (+) here 
     AND a.cust_id = b.cust_id (+) 
    ORDER BY 2 

나는 고객 목록 (A)과 주문 목록 (B)이있는 테이블을 가지고 있습니다. 고객이 배치 한 주문. 위의 쿼리는 해당 고객과 연결된 주문이있는 경우 모든 고객의 이름과 주문 번호를 알려줍니다.고객 및 주문 두 테이블에 합류하여 주문이있는 경우

내 질문은 .. 주문을하지 않은 경우에도 모든 고객에게 b.addr_type 뒤에 (+)를 추가해야하는 이유는 무엇입니까?

+4

오늘의 팁 : 현대적인 명시 적 조인 구문으로 전환하십시오! – jarlh

+0

[SQL Server에서 LEFT JOIN 및 LEFT OUTER JOIN]의 가능한 복제본 (http://stackoverflow.com/questions/406294/left-join-and-left-outer-join-in-sql-server) – SomeJavaGuy

답변

2

의 (+) 구문을 더 읽을 수

같은 질문을 피하기 위해
SELECT 
    c.ORG, c.ID, c.NAME, o.ordNum 
FROM customers c -- Use meaningful aliases to improve readability 
LEFT JOIN orders o 
    ON c.org = o.org 
    AND c.cust_id = o.cust_id 
    AND o.addr_type = 'ST' 
WHERE 
    c.org = 'JJJ' 
ORDER BY c.ID 
+0

그래서 해당 행을 and (b.addr_type = 'ST'또는 b.addr_type이 null)로 바꾸는 것은 트릭을 수행할까요? – psj01

+0

및 감사합니다. 이것은 내가 excatly 찾고있는 설명입니다. ! – psj01

+0

예,'and (b.addr_type = 'ST'또는 b.addr_type이 null)'로 바꾸면 트릭을 수행 할 것입니다 – Carlo

3

(+)는 이전 스타일 구문의 "외부 조인"입니다. 즉, 일치하지 않으면 조인의 왼쪽에있는 모든 행이 오른쪽 테이블의 열에 "null"과 함께 반환됩니다.

오른쪽에 일치 항목이 없으면 INNER 조인 (구식 SQL의 일반 같음)은 레코드를 반환하지 않습니다.

현대 구문은 단어 "LEFT"를 사용하는 경우 "OUTER"부분을 선택, 참으로 암시 적

SELECT A.ORG, A.ID, A.NAME, b.ordNum FROM 
customers A 
LEFT OUTER JOIN customers b on a.id = b.id 
       AND a.cust_id = b.cust_id 
       AND b.addr_type = 'ST' 
WHERE a.org = 'JJJ' 
ORDER BY 2 

입니다. 다른 옵션은 외부 조인의 경우 RIGHT 및 FULL입니다.

왜이 새로운 구문을 사용합니까? ANSI SQL 호환이므로 (+)는 더 이상 사용되지 않으며 일부 최신 RDBMS 구현으로 포팅되지 않습니다. 또한이 게시물에 대한 의견에 따르면 죄가 유지 될 정도로 추악합니다.

+1

오라클이 아닙니다. 특정 RDBMS가이를 지원합니다. 즉, 올바르게 작동하지 않는 경우가 있으므로 더 이상 사용되지 않으며 쓰기, 읽기, 유지 관리, 디버그 등 악몽입니다. ​​ – MatBailie

+0

아, 설명해 주셔서 감사합니다! –

4

구식 JOIN 구문입니다. 여기에서 (+)OUTER JOIN입니다. 즉, 왼쪽 표의 모든 행은 오른쪽 표와 일치하는지 여부에 관계없이 리턴됩니다. 주문한 고객 만 얻으려면 INNER JOIN을 사용하십시오.

SELECT a.org, 
      a.id, 
      a.Name, 
      b.ordNum 
     FROM customers a LEFT JOIN 
      orders b ON (a.org = b.org) 
        AND (b.addr_type = 'ST') 
        AND (a.cust_id = b.cust_id) 
    WHERE a.org = 'JJJ' 
    ORDER BY a.id -- better put it direct, not field's index 
+3

"구식"이라고 말하면 매우 오래되었습니다. "새로운 스타일"구문은 1992 년부터 나왔습니다. 아무도 암시 적 조인을 더 이상 사용하지 않아야합니다. 그들은 읽기, 유지 보수 등을하기가 더 어려우며, 어떤 경우에는 실제로 올바르게 작동하지 않으며 더 이상 사용되지 않습니다. – MatBailie

+0

@MatBailie, 추가 입력을 주셔서 감사합니다! –

2

, 스위치 LEFT JOIN에 대한 구문 : 또한 JOIN 명시 아닌 이전 스타일의 구문을 사용한다 Oracle에 내부 조인 대신 왼쪽 조인을 실행하도록 지시합니다.

결과는 customers의 값이 지정된 모든 열과 orders 테이블의 일부 빈 열이있는 레코드 목록입니다.

orders 테이블의 열은 원하는 결과를 얻을되지 않도록 조건 b.addr_type = 'ST'가이 기록을 위해 항상 FALSENULL을 경우.

대신에 b.addr_type(+) = 'ST'을 쓰면 상태와 일치하는 모든 열과 NULL 값을 얻을 수 있습니다. 왼쪽 결합으로 얻고 자하는 것입니다.

관련 문제