INNER JOIN과 LEFT SEMI JOIN의 차이점
INNER JOIN
과 의 차이점은 무엇입니까 LEFT SEMI JOIN
?
아래 시나리오에서 두 가지 다른 결과가 나오는 이유는 무엇입니까?
INNER JOIN
결과 집합 많이 큽니다. 누군가 설명 할 수 있습니까? table_1
에만 나타나는 이름을 얻으려고합니다 table_2
.
SELECT name
FROM table_1 a
INNER JOIN table_2 b ON a.name=b.name
SELECT name
FROM table_1 a
LEFT SEMI JOIN table_2 b ON (a.name=b.name)
An INNER JOIN
은 두 테이블의 열을 반환합니다. A LEFT SEMI JOIN
는 왼쪽 테이블의 레코드 만 반환합니다. (표준 SQL에서) 다음과 같습니다.
SELECT name
FROM table_1 a
WHERE EXISTS(
SELECT * FROM table_2 b WHERE (a.name=b.name))
오른쪽 열에 일치하는 행 이 여러 개있는 경우 INNER JOIN
는 오른쪽 테이블의 각 일치 항목에 대해 하나의 행을 LEFT SEMI JOIN
반환하는 반면 a 는 오른쪽의 일치하는 행 수에 관계없이 왼쪽 테이블의 행만 반환합니다. 이것이 결과에 다른 수의 행이 표시되는 이유입니다.
table_2에만 나타나는 table_1 내의 이름을 얻으려고합니다.
그런 다음 a LEFT SEMI JOIN
는 사용할 적절한 쿼리입니다.
2 개의 열 (Id, Data) 및 다음 데이터 만있는 TableA 및 TableB 테이블이 2 개 있다고 가정합니다.
TableA :
+----+---------+
| Id | Data |
+----+---------+
| 1 | DataA11 |
| 1 | DataA12 |
| 1 | DataA13 |
| 2 | DataA21 |
| 3 | DataA31 |
+----+---------+
표 B :
+----+---------+
| Id | Data |
+----+---------+
| 1 | DataB11 |
| 2 | DataB21 |
| 2 | DataB22 |
| 2 | DataB23 |
| 4 | DataB41 |
+----+---------+
열의 내부 조인Id
은 테이블의 열과 일치하는 레코드 만 반환합니다.
.----.---------.----.---------.
| Id | Data | Id | Data |
:----+---------+----+---------:
| 1 | DataA11 | 1 | DataB11 |
:----+---------+----+---------:
| 1 | DataA12 | 1 | DataB11 |
:----+---------+----+---------:
| 1 | DataA13 | 1 | DataB11 |
:----+---------+----+---------:
| 2 | DataA21 | 2 | DataB21 |
:----+---------+----+---------:
| 2 | DataA21 | 2 | DataB22 |
:----+---------+----+---------:
| 2 | DataA21 | 2 | DataB23 |
'----'---------'----'---------'
열의 왼쪽 조인 (또는 왼쪽 외부 조인) Id
은 두 테이블의 열과 왼쪽 테이블의 레코드와 일치하는 레코드 (오른쪽 테이블의 Null 값 )를 반환합니다.
.----.---------.----.---------.
| Id | Data | Id | Data |
:----+---------+----+---------:
| 1 | DataA11 | 1 | DataB11 |
:----+---------+----+---------:
| 1 | DataA12 | 1 | DataB11 |
:----+---------+----+---------:
| 1 | DataA13 | 1 | DataB11 |
:----+---------+----+---------:
| 2 | DataA21 | 2 | DataB21 |
:----+---------+----+---------:
| 2 | DataA21 | 2 | DataB22 |
:----+---------+----+---------:
| 2 | DataA21 | 2 | DataB23 |
:----+---------+----+---------:
| 3 | DataA31 | | |
'----'---------'----'---------'
열의 오른쪽 조인 (또는 오른쪽 외부 조인) Id
은 테이블의 열과 오른쪽 테이블의 레코드와 일치하는 레코드 (왼쪽 테이블의 Null 값 )를 반환합니다.
┌────┬─────────┬────┬─────────┐
│ Id │ Data │ Id │ Data │
├────┼─────────┼────┼─────────┤
│ 1 │ DataA11 │ 1 │ DataB11 │
│ 1 │ DataA12 │ 1 │ DataB11 │
│ 1 │ DataA13 │ 1 │ DataB11 │
│ 2 │ DataA21 │ 2 │ DataB21 │
│ 2 │ DataA21 │ 2 │ DataB22 │
│ 2 │ DataA21 │ 2 │ DataB23 │
│ │ │ 4 │ DataB41 │
└────┴─────────┴────┴─────────┘
열에 대한 전체 외부 조인Id
은 테이블의 열과 왼쪽 테이블의 레코드 (오른쪽 테이블의 Null 값) 및 오른쪽 테이블의 레코드 (왼쪽 테이블의 Null 값)와 일치하는 레코드를 모두 반환합니다.
╔════╦═════════╦════╦═════════╗
║ Id ║ Data ║ Id ║ Data ║
╠════╬═════════╬════╬═════════╣
║ - ║ ║ ║ ║
║ 1 ║ DataA11 ║ 1 ║ DataB11 ║
║ 1 ║ DataA12 ║ 1 ║ DataB11 ║
║ 1 ║ DataA13 ║ 1 ║ DataB11 ║
║ 2 ║ DataA21 ║ 2 ║ DataB21 ║
║ 2 ║ DataA21 ║ 2 ║ DataB22 ║
║ 2 ║ DataA21 ║ 2 ║ DataB23 ║
║ 3 ║ DataA31 ║ ║ ║
║ ║ ║ 4 ║ DataB41 ║
╚════╩═════════╩════╩═════════╝
열의 Left Semi JoinId
은 왼쪽 테이블에서만 열 을 반환하고 왼쪽 테이블에서만 일치하는 레코드를 반환합니다.
┌────┬─────────┐
│ Id │ Data │
├────┼─────────┤
│ 1 │ DataA11 │
│ 1 │ DataA12 │
│ 1 │ DataA13 │
│ 2 │ DataA21 │
└────┴─────────┘
Hive에서 시도하고 아래 출력을 얻었습니다.
1 번 테이블
1, wqe, 첸나이, 인도
2, stu, salem, 인도
3,mia,bangalore,india
4,yepie,newyork,USA
table2
1,wqe,chennai,india
2,stu,salem,india
3,mia,bangalore,india
5,chapie,Los angels,USA
Inner Join
SELECT * FROM table1 INNER JOIN table2 ON (table1.id = table2.id);
1 wqe chennai india 1 wqe chennai india
2 stu salem india 2 stu salem india
3 mia bangalore india 3 mia bangalore india
Left Join
SELECT * FROM table1 LEFT JOIN table2 ON (table1.id = table2.id);
1 wqe chennai india 1 wqe chennai india
2 stu salem india 2 stu salem india
3 mia bangalore india 3 mia bangalore india
4 yepie newyork USA NULL NULL NULL NULL
Left Semi Join
SELECT * FROM table1 LEFT SEMI JOIN table2 ON (table1.id = table2.id);
1 wqe chennai india
2 stu salem india
3 mia bangalore india
note: Only records in left table are displayed whereas for Left Join both the table records displayed
참고URL : https://stackoverflow.com/questions/21738784/difference-between-inner-join-and-left-semi-join
'developer tip' 카테고리의 다른 글
자바 스크립트에서 문자열의 줄 수를 계산하는 방법 (0) | 2020.11.13 |
---|---|
자바 스크립트를 사용한 세션 전용 쿠키 (0) | 2020.11.13 |
nginx / 승객의 "신청서에서받은 불완전한 응답" (0) | 2020.11.13 |
겉보기에 간단하고 명백한 사례에서 C #이 유형을 추론 할 수없는 이유 (0) | 2020.11.12 |
[DllImport ( "QCall")]은 무엇입니까? (0) | 2020.11.12 |