2011-09-22 2 views
4

왼쪽 조인을 사용하지 않고 왼쪽 조인과 동등한 작업을 수행하는 방법을 알려줄 수 있습니까? 오라클은 왼쪽 위장SQL에서 왼쪽 조인을 대체 할 수있는 방법

Select * from a left join b on a.name = b.name. 
+3

Select * from b right a.name = b.name에서 a에 가입하십시오. – Johan

+2

그냥 농담하는거야, 왜 그러고 싶니? – Johan

+0

정말 조인을 사용하지 않고서는, 문제는 내가 Hibernate에서 작업하기 위해 왼쪽 조인을 할 수없고 그것을 완전히 없애 버릴 것이라는 것이 었습니다. –

답변

0

가입 :

SELECT * FROM A, B 
WHERE a.name = b.name(+) 

일반 :

SELECT a.*, case c.existence WHEN 1 then c.name ELSE NULL END 
    FROM A 
INNER JOIN (SELECT name name, 1 existence FROM B 
       UNION ALL 
       SELECT a.name name, 0 existence FROM A 
       WHERE a.name NOT IN (SELECT name FROM B) 
      ) C 
    ON c.name = a.name 
8

곰을 염두에 SQL의 외부 명시 적으로 null 값을 프로젝트 설계 관계형 노동 조합의 일종 조인. null 값을 사용하지 않으려면 (내 생각에), 외부 조인을 사용하지 않는 것이 좋습니다. 현대의 관계형 언어는 널과 외부 조인의 개념을 전제로하고 있습니다.

이 외부

가입 :

SELECT DISTINCT T1.id, T1.value, T2.other_value 
    FROM T1 
     LEFT OUTER JOIN T2 
      ON T1.id = T2.id; 

가 ...이 SQL 코드에 의미 것과 같습니다

SELECT T1.id, T1.value, T2.other_value 
    FROM T1 
     INNER JOIN T2 
      ON T1.id = T2.id 
UNION 
SELECT T1.id, T1.value, NULL 
    FROM T1 
WHERE NOT EXISTS (
        SELECT * 
        FROM T2 
        WHERE T1.id = T2.id 
       ); 

두 번째 쿼리가 긴 호흡 그러나 그것은 단지 방식 때문에 SQL 설계되었습니다의이다 보일 수 있습니다/진화했다. 위의 것은 단지 자연 조인, 유니온 및 세미 조인입니다. 그러나 SQL에는 semijoin 연산자가 없으므로 SELECT 절에 열 목록을 지정하고 표준 SQL의 NATURAL JOIN 구문을 구현하지 않은 경우 JOIN 절을 작성해야합니다. 그러면 매우 간단한 코드를 표현할 수 있습니다.

따라서 위의 두 번째 쿼리와 같은 코드를 작성할 수 있지만 null 값이 아닌 실제 기본값을 사용합니다.

1

대체 방법에 비해 왼쪽 외부 조인은 sql을 작성하는 데 권장되는 방법이지만 여전히 결과 집합에 대해 합집합을 사용하여 왼쪽 외부 조인을 수행 할 수 있습니다. 이 같은 결과를 달성하는 데 도움이됩니다

select 
     A.Id, 
     A.Col1, 
     A.Col2, 
     A.Col3, 
     B.Id Col4, 
     B.Col1 Col5, 
     B.Col2 Col6, 
     B.Col3 Col7, 
     B.Col4 Col8 
from Table1 A, Table2 B 
where A.Id = B.Id 

union all 

select 
     A.Id, 
     A.Col1, 
     A.Col2, 
     A.Col3, 
     null as Col4, 
     null as Col5, 
     null as Col6, 
     null as Col7, 
     null as Col8 
from Table1 A 
where not exists(select 1 from Table2 B where B.Id = A.Id) 

하지만 때문에 연합 (EU)의 사용의 테이블이있는 경우 일부 성능 문제가있을 수 있습니다 - 우리가 두 개의 테이블 표 1과 표 2를 가지고 있다면 우리는 다음과 같은하여이 작업을 수행 할 수 있습니다 큰.

관련 문제