developer tip

INNER JOIN과 LEFT SEMI JOIN의 차이점

copycodes 2020. 11. 13. 23:40
반응형

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

반응형