Join
join 접두사는 로드한 테이블을 기존의 명명된 테이블이나 마지막으로 생성한 데이터 테이블과 조인합니다.
데이터 조인의 효과는 대상 테이블에 아직 없는 추가 필드 또는 속성 집합으로 대상 테이블을 확장하는 것입니다. 소스 데이터 집합과 대상 테이블 간의 공통 필드 이름은 새로 들어오는 레코드를 연결하는 방법을 알아내는 데 사용됩니다. 이를 일반적으로 "자연 조인(natural join)"이라고 합니다. Qlik 조인 작업은 조인 연결의 고유성과 사용된 조인 유형에 따라 결과 대상 테이블의 레코드 수가 시작할 때보다 많거나 적어질 수 있습니다.
조인 유형
조인에는 네 가지 유형이 있습니다.
-
Left join
-
Inner join
-
Outer join
-
Right join
다양한 유형의 조인 작업의 예시 결과 집합

Left join
Left join은 가장 일반적인 조인 유형입니다. 예를 들어 트랜잭션 데이터 집합이 있고 이를 참조 데이터 집합과 결합하려는 경우 일반적으로 Left Join을 사용합니다. 트랜잭션 테이블을 먼저 로드한 다음 이미 로드된 트랜잭션 테이블에 Left Join 접두사를 통해 조인하면서 참조 데이터 집합을 로드합니다. Left Join은 모든 트랜잭션을 그대로 유지하고 일치하는 항목이 있는 보충 참조 데이터 필드를 추가합니다.
Left join

Inner join
일치하는 연결이 있는 결과에만 관심이 있는 두 개의 데이터 집합이 있는 경우 Inner Join을 사용하는 것이 좋습니다. 이렇게 하면 일치하는 항목이 없는 경우 로드된 소스 데이터와 대상 테이블 모두에서 모든 레코드가 제거됩니다. 결과적으로 조인 작업이 수행되기 전보다 대상 테이블에 더 적은 레코드가 남을 수 있습니다.
Inner join

Outer join(기본값)
대상 레코드와 들어오는 모든 레코드를 모두 유지해야 하는 경우 Outer Join을 사용합니다. 일치하는 항목이 없는 경우 각 레코드 집합은 계속 유지되지만 조인의 반대쪽 필드는 채워지지 않은 상태(null)로 유지됩니다.
유형 키워드를 생략하면 기본 조인 유형은 Outer join입니다.
Outer join

Right join
이 조인 유형은 로드하려는 모든 레코드를 유지하면서 조인의 대상이 되는 테이블의 레코드를 들어오는 레코드에 연결 일치가 있는 레코드로만 줄입니다. 이것은 이미 미리 로드된 레코드 테이블을 필요한 하위 집합으로 줄이는 수단으로 때때로 사용되는 틈새 조인 유형입니다.
Right join

Cross join
"크로스 조인" 작업의 예시 결과 집합

구문 및 인수
[inner | outer | left | right ]Join [ (tablename ) ]( loadstatement | selectstatement )
| 인수 | 설명 |
|---|---|
| tablename | 로드된 테이블과 비교할 명명된 테이블입니다. |
| loadstatement또는 selectstatement | 로드된 테이블에 사용되는 LOAD 또는 SELECT 문입니다. |
관련 주제
다음 주제는 이 함수를 사용하는 데 도움이 될 수 있습니다.
| 주제 | 설명 |
|---|---|
| Join 및 Keep을 사용한 테이블 결합 | 이 주제에서는 데이터 집합을 "조인(joining)"하고 "유지(keeping)"하는 개념에 대해 자세히 설명합니다. |
| Keep | Keep 로드 접두사는 Join 접두사와 유사하지만 소스 및 대상 데이터 집합을 결합하지 않습니다. 대신 채택된 작업 유형(inner, outer, left 또는 right)에 따라 각 데이터 집합을 자릅니다. |
로드 스크립트 예 - Left join
Left join은 기본(대상) 테이블의 모든 레코드를 유지하고 두 번째(소스) 테이블에서 일치하는 데이터를 추가합니다. 소스에 일치하는 항목이 없으면 기본 테이블의 레코드가 계속 표시되지만 소스 테이블의 필드는 비어 있습니다.
예제 스크립트를 응용 프로그램에 추가하고 실행합니다. 결과를 보려면 결과 열에 나열된 필드를 응용 프로그램의 시트에 추가합니다.
로드 스크립트
Table1:
Load * inline [
Column1, Column2
A, B
1, aa
2, cc
3, ee ];
Table2:
Left Join Load * inline [
Column1, Column3
A, C
1, xx
4, yy ]; 인라인 로드 사용에 대한 자세한 내용은 인라인 로드를 사용하여 데이터 로드를 참조하십시오.
결과
| Column1 | Column2 | Column3 |
|---|---|---|
| A | B | C |
| 1 | aa | xx |
| 2 | cc | - |
| 3 | ee | - |
이 예는 첫 번째(왼쪽) 테이블에 있는 값만 조인되는 Left Join 출력을 보여줍니다.
개요
주문 목록이 있지만 모든 주문에 일치하는 고객 레코드가 있는 것은 아니라고 가정해 보겠습니다.
로드 스크립트
Orders:
Load * inline [
OrderID, CustomerID, Amount
1, 101, 200
2, 102, 150
3, 104, 400
];
Customers:
Left Join (Orders)
Load * inline [
CustomerID, Name
101, Alice
102, Bob
103, Carol
];결과
데이터 모델 뷰어에서 미리 보기 창을 확장하면 전체 결과 집합의 일부가 테이블로 구성된 것을 볼 수 있습니다.
|
OrderID |
CustomerID | Amount | Name |
|---|---|---|---|
|
1 |
101 | 200 | Alice |
|
2 |
102 | 150 | Bob |
|
3 |
104 | 400 | - |
OrderID 1과 2에는 일치하는 고객이 있습니다. OrderID 3에는 일치하는 고객이 없으므로 Name이 비어 있습니다.
개요
데이터 로드 편집기를 열고 새 섹션에 아래 로드 스크립트를 추가합니다.
로드 스크립트에는 다음이 포함됩니다.
-
변경 레코드를 나타내는 데이터 집합으로, Changes라는 테이블에 로드됩니다. 여기에는 Status ID 키 필드가 포함됩니다.
-
변경 상태를 나타내는 두 번째 데이터 집합으로, 왼쪽 Join 로드 접두사와 조인하여 로드되고 원래 변경 레코드와 결합됩니다.
이 Left join은 공통 Status ID를 기반으로 들어오는 상태 레코드에서 일치하는 항목이 발견되는 상태 속성을 추가하는 동안 변경 레코드가 그대로 유지되도록 합니다.
로드 스크립트
Changes:
Load * inline [
Change ID Status ID Scheduled Start Date Scheduled End Date Business Impact
10030 4 19/01/2022 23/02/2022 None
10015 3 04/01/2022 15/02/2022 Low
10103 1 02/04/2022 29/05/2022 Medium
10185 2 23/06/2022 08/09/2022 None
10323 1 08/11/2022 26/11/2022 High
10326 2 11/11/2022 05/12/2022 None
10138 2 07/05/2022 03/08/2022 None
10031 3 20/01/2022 25/03/2022 Low
10040 1 29/01/2022 22/04/2022 None
10134 1 03/05/2022 08/07/2022 Low
10334 2 19/11/2022 06/02/2023 Low
10220 2 28/07/2022 06/09/2022 None
10264 1 10/09/2022 17/10/2022 Medium
10116 1 15/04/2022 24/04/2022 None
10187 2 25/06/2022 24/08/2022 Low
] (delimiter is '\t');
Status:
Left Join (Changes)
Load * inline [
Status ID Status Sub Status
1 Open Not Started
2 Open Started
3 Closed Completed
4 Closed Cancelled
5 Closed Obsolete
] (delimiter is '\t');결과
데이터 모델 뷰어를 열고 데이터 모델의 모양을 확인합니다. 정규화되지 않은 테이블이 하나만 있습니다. 이는 모든 원래 변경 레코드의 조합이며 일치하는 상태 속성이 각 변경 레코드에 조인되어 있습니다.
|
Changes |
|---|
|
Change ID |
|
Status ID |
|
Scheduled Start Date |
|
Scheduled End Date |
|
Business Impact |
|
Status |
|
Sub Status |
데이터 모델 뷰어에서 미리 보기 창을 확장하면 이 전체 결과 집합의 일부가 테이블로 구성된 것을 볼 수 있습니다.
|
Change ID |
Status ID | Scheduled Start Date | Scheduled End Date | Business Impact | Status | Sub Status |
|---|---|---|---|---|---|---|
|
10030 |
4 | 19/01/2022 | 23/02/2022 | None | Closed | Cancelled |
|
10031 |
3 | 20/01/2022 | 25/03/2022 | Low | Closed | Completed |
|
10015 |
3 | 04/01/2022 | 15/02/2022 | Low | Closed | Completed |
|
10103 |
1 | 02/04/2022 | 29/05/2022 | Medium | Open | Not Started |
| 10116 | 1 | 15/04/2022 | 24/04/2022 | None | Open | Not Started |
|
10134 |
1 | 03/05/2022 | 08/07/2022 | Low | Open | Not Started |
| 10264 | 1 | 10/09/2022 | 17/10/2022 | Medium | Open | Not Started |
|
10040 |
1 | 29/01/2022 | 22/04/2022 | None | Open | Not Started |
| 10323 | 1 | 08/11/2022 | 26/11/2022 | High | Open | Not Started |
| 10187 | 2 | 25/06/2022 | 24/08/2022 | Low | Open | Started |
| 10185 | 2 | 23/06/2022 | 08/09/2022 | None | Open | Started |
| 10220 | 2 | 28/07/2022 | 06/09/2022 | None | Open | Started |
| 10326 | 2 | 11/11/2022 | 05/12/2022 | None | Open | Started |
|
10138 |
2 | 07/05/2022 | 03/08/2022 | None | Open | Started |
| 10334 | 2 | 19/11/2022 | 06/02/2023 | Low | Open | Started |
Status 테이블의 다섯 번째 행(Status ID: '5', Status: 'Closed', Sub Status: 'Obsolete')은 Changes 테이블의 어떤 레코드와도 일치하지 않으므로 이 행의 정보는 위의 결과 집합에 나타나지 않습니다.
데이터 로드 편집기로 돌아갑니다. 데이터를 로드하고 시트를 엽니다. 새 테이블을 만들고 이 필드를 차원으로 추가합니다. Status.
다음 측정값을 추가합니다.
=Count([Change ID])
이제 상태별 변경 수를 검사할 수 있습니다.
| Status | =Count([Change ID]) |
|---|---|
| Open | 12 |
| Closed | 3 |
로드 스크립트 예 - Inner join
Inner join은 두 테이블 모두에 존재하는 레코드만 유지합니다(일치하는 필드 값 기준).
로드 스크립트
예제 스크립트를 응용 프로그램에 추가하고 실행합니다. 결과를 보려면 결과 열에 나열된 필드를 응용 프로그램의 시트에 추가합니다.
Table1:
Load * inline [
Column1, Column2
A, B
1, aa
2, cc
3, ee ];
Table2:
Inner Join Load * inline [
Column1, Column3
A, C
1, xx
4, yy ];인라인 로드 사용에 대한 자세한 내용은 인라인 로드를 사용하여 데이터 로드참조하십시오.
결과
| Column1 | Column2 | Column3 |
|---|---|---|
| A | B | C |
| 1 | aa | xx |
이 예는 첫 번째(왼쪽) 테이블과 두 번째(오른쪽) 테이블 모두에 있는 값만 조인되는 Inner Join 출력을 보여줍니다.
개요
주문과 배송된 주문 목록이 있습니다. 배송된 주문만 원합니다.
로드 스크립트
Orders:
Load * inline [
OrderID, Amount
1, 200
2, 150
3, 400
];
Shipped:
Inner Join (Orders)
Load * inline [
OrderID, ShipDate
2, 2022-05-01
3, 2022-05-02
4, 2022-05-03
];결과
데이터 모델 뷰어에서 미리 보기 창을 확장하면 전체 결과 집합의 일부가 테이블로 구성된 것을 볼 수 있습니다.
| OrderID | Amount | ShipDate |
|---|---|---|
| 2 | 150 | 2022-05-01 |
| 3 | 400 | 2022-05-02 |
OrderID 2와 3은 두 테이블 모두에 존재하므로 이들만 나타납니다.
개요
데이터 로드 편집기를 열고 새 섹션에 아래 로드 스크립트를 추가합니다.
로드 스크립트에는 다음이 포함됩니다.
-
변경 레코드를 나타내는 데이터 집합으로, Changes라는 테이블에 로드됩니다.
-
소스 시스템 JIRA에서 시작된 변경 레코드를 나타내는 두 번째 데이터 집합입니다. 이는 Inner Join 로드 접두사와 조인하여 로드되고 원래 레코드와 결합됩니다.
이 Inner Join은 두 데이터 집합 모두에서 발견되는 5개의 변경 레코드만 유지되도록 합니다.
로드 스크립트
Changes:
Load * inline [
Change ID Status ID Scheduled Start Date Scheduled End Date Business Impact
10030 4 19/01/2022 23/02/2022 None
10015 3 04/01/2022 15/02/2022 Low
10103 1 02/04/2022 29/05/2022 Medium
10185 2 23/06/2022 08/09/2022 None
10323 1 08/11/2022 26/11/2022 High
10326 2 11/11/2022 05/12/2022 None
10138 2 07/05/2022 03/08/2022 None
10031 3 20/01/2022 25/03/2022 Low
10040 1 29/01/2022 22/04/2022 None
10134 1 03/05/2022 08/07/2022 Low
10334 2 19/11/2022 06/02/2023 Low
10220 2 28/07/2022 06/09/2022 None
10264 1 10/09/2022 17/10/2022 Medium
10116 1 15/04/2022 24/04/2022 None
10187 2 25/06/2022 24/08/2022 Low
] (delimiter is '\t');
JIRA_changes:
Inner Join (Changes)
Load
[Ticket ID] AS [Change ID],
[Source System]
inline
[
Ticket ID Source System
10000 JIRA
10030 JIRA
10323 JIRA
10134 JIRA
10334 JIRA
10220 JIRA
20000 TFS
] (delimiter is '\t');결과
데이터를 로드하고 시트를 엽니다. 새 테이블을 만들고 다음 필드를 차원으로 추가합니다.
-
Source System
-
Change ID
-
Business Impact
이제 5개의 결과 레코드를 검사할 수 있습니다. Inner Join의 결과 테이블에는 두 데이터 집합 모두에 일치하는 정보가 있는 레코드만 포함됩니다.
| Source System | Change ID | Business Impact |
|---|---|---|
| JIRA | 10030 | None |
| JIRA | 10134 | Low |
| JIRA | 10220 | None |
| JIRA | 10323 | High |
| JIRA | 10334 | Low |
로드 스크립트 예 - Outer join
Outer join은 두 테이블의 모든 레코드를 유지합니다. 일치하는 항목이 없으면 필드는 비워 둡니다.
로드 스크립트
예제 스크립트를 응용 프로그램에 추가하고 실행합니다. 결과를 보려면 결과 열에 나열된 필드를 응용 프로그램의 시트에 추가합니다.
Table1:
Load * inline [
Column1, Column2
A, B
1, aa
2, cc
3, ee ];
Table2:
Outer Join Load * inline [
Column1, Column3
A, C
1, xx
4, yy ]; 인라인 로드 사용에 대한 자세한 내용은 인라인 로드를 사용하여 데이터 로드를 참조하십시오.
결과
| Column1 | Column2 | Column3 |
|---|---|---|
| A | B | C |
| 1 | aa | xx |
| 2 | cc | - |
| 3 | ee | - |
| 4 | - | yy |
이 예에서 두 테이블 Table1과 Table2는 Table1이라는 단일 테이블로 병합됩니다. 이와 같은 경우 단일 테이블의 값에 대한 집계를 수행하기 위해 여러 테이블을 단일 테이블로 조인하는 데 outer 접두사가 자주 사용됩니다.
개요
일부 고객에게 주문이 없고 일부 주문에 고객 레코드가 없더라도 모든 고객과 주문의 전체 목록을 원합니다.
로드 스크립트
Orders:
Load * inline [
OrderID, CustomerID
1, 101
2, 102
3, 104
];
Customers:
Outer Join (Orders)
Load * inline [
CustomerID, Name
101, Alice
102, Bob
103, Carol
];결과
데이터 모델 뷰어에서 미리 보기 창을 확장하면 이 전체 결과 집합의 일부가 테이블로 구성된 것을 볼 수 있습니다.
| OrderID | CustomerID | Name |
|---|---|---|
| 1 | 101 | Alice |
| 2 | 102 | Bob |
| 3 | 104 | - |
| - | 103 | Carol |
OrderID 3에는 일치하는 고객이 없습니다(Name 비어 있음).
CustomerID 103(Carol)에는 일치하는 주문이 없습니다(OrderID 비어 있음).
개요
데이터 로드 편집기를 열고 새 섹션에 아래 로드 스크립트를 추가합니다.
로드 스크립트에는 다음이 포함됩니다.
-
변경 레코드를 나타내는 데이터 집합으로, Changes라는 테이블에 로드됩니다.
-
소스 시스템 JIRA에서 시작된 변경 레코드를 나타내는 두 번째 데이터 집합으로, Outer Join 로드 접두사와 조인하여 로드되고 원래 레코드와 결합됩니다.
이렇게 하면 두 데이터 집합에서 겹치는 모든 변경 레코드가 유지됩니다.
로드 스크립트
// 8 Change records
Changes:
Load * inline [
Change ID Status ID Scheduled Start Date Scheduled End Date Business Impact
10030 4 19/01/2022 23/02/2022 None
10015 3 04/01/2022 15/02/2022 Low
10138 2 07/05/2022 03/08/2022 None
10031 3 20/01/2022 25/03/2022 Low
10040 1 29/01/2022 22/04/2022 None
10134 1 03/05/2022 08/07/2022 Low
10334 2 19/11/2022 06/02/2023 Low
10220 2 28/07/2022 06/09/2022 None
] (delimiter is '\t');
// 6 Change records
JIRA_changes:
Outer Join (Changes)
Load
[Ticket ID] AS [Change ID],
[Source System]
inline
[
Ticket ID Source System
10030 JIRA
10323 JIRA
10134 JIRA
10334 JIRA
10220 JIRA
10597 JIRA
] (delimiter is '\t');결과
데이터를 로드하고 시트를 엽니다. 새 테이블을 만들고 다음 필드를 차원으로 추가합니다.
-
Source System
-
Change ID
-
Business Impact
이제 10개의 결과 레코드를 검사할 수 있습니다.
| Source System | Change ID | Business Impact |
|---|---|---|
| JIRA | 10030 | None |
| JIRA | 10134 | Low |
| JIRA | 10220 | None |
| JIRA | 10323 | - |
| JIRA | 10334 | Low |
| JIRA | 10597 | - |
| - | 10015 | Low |
| - | 10031 | Low |
| - | 10040 | None |
| - | 10138 | None |
로드 스크립트 예 - Right join
Right join은 소스 테이블의 모든 레코드를 유지하고 대상 테이블에서 일치하는 정보를 추가합니다. 대상 테이블에 일치하는 항목이 없으면 해당 필드는 비어 있습니다.
로드 스크립트
예제 스크립트를 응용 프로그램에 추가하고 실행합니다. 결과를 보려면 결과 열에 나열된 필드를 응용 프로그램의 시트에 추가합니다.
Table1:
Load * inline [
Column1, Column2
A, B
1, aa
2, cc
3, ee ];
Table2:
Right Join Load * inline [
Column1, Column3
A, C
1, xx
4, yy ];인라인 로드 사용에 대한 자세한 내용은 인라인 로드를 사용하여 데이터 로드를 참조하십시오.
결과
| Column1 | Column2 | Column3 |
|---|---|---|
| A | B | C |
| 1 | aa | xx |
| 4 | - | yy |
이 예는 두 번째(오른쪽) 테이블에 있는 값만 조인되는 Right Join 출력을 보여줍니다.
개요
소스 테이블은 고객 목록입니다. 모든 고객과 일치하는 주문을 원합니다.
로드 스크립트
Orders:
Load * inline [
OrderID, CustomerID
1, 101
2, 102
3, 104
];
Customers:
Right Join (Orders)
Load * inline [
CustomerID, Name
101, Alice
102, Bob
103, Carol
];결과
데이터 모델 뷰어에서 미리 보기 창을 확장하면 이 전체 결과 집합의 일부가 테이블로 구성된 것을 볼 수 있습니다.
| CustomerID | Name | OrderID |
|---|---|---|
| 101 | Alice | 1 |
| 102 | Bob | 2 |
| 103 | Carol | - |
모든 고객이 나타납니다. Carol은 주문이 없습니다(OrderID 비어 있음).
개요
데이터 로드 편집기를 열고 새 섹션에 아래 로드 스크립트를 추가합니다.
로드 스크립트에는 다음이 포함됩니다.
-
변경 레코드를 나타내는 데이터 집합으로, Changes라는 테이블에 로드됩니다.
-
소스 시스템 Teamwork에서 시작된 변경 레코드를 나타내는 두 번째 데이터 집합입니다. 이는 Right Join 로드 접두사와 조인하여 로드되고 원래 레코드와 결합됩니다.
이렇게 하면 Teamwork 변경 레코드만 유지되는 동시에 대상 테이블에 일치하는 Change ID가 없는 경우 Teamwork 레코드가 손실되지 않습니다.
로드 스크립트
Changes:
Load * inline [
Change ID Status ID Scheduled Start Date Scheduled End Date Business Impact
10030 4 19/01/2022 23/02/2022 None
10015 3 04/01/2022 15/02/2022 Low
10103 1 02/04/2022 29/05/2022 Medium
10185 2 23/06/2022 08/09/2022 None
10323 1 08/11/2022 26/11/2022 High
10326 2 11/11/2022 05/12/2022 None
10138 2 07/05/2022 03/08/2022 None
10031 3 20/01/2022 25/03/2022 Low
10040 1 29/01/2022 22/04/2022 None
10134 1 03/05/2022 08/07/2022 Low
10334 2 19/11/2022 06/02/2023 Low
10220 2 28/07/2022 06/09/2022 None
10264 1 10/09/2022 17/10/2022 Medium
10116 1 15/04/2022 24/04/2022 None
10187 2 25/06/2022 24/08/2022 Low
] (delimiter is '\t');
Teamwork_changes:
Right Join (Changes)
Load
[Ticket ID] AS [Change ID],
[Source System]
inline
[
Ticket ID Source System
10040 Teamwork
10015 Teamwork
10103 Teamwork
10031 Teamwork
50231 Teamwork
] (delimiter is '\t');결과
데이터를 로드하고 시트를 엽니다. 새 테이블을 만들고 다음 필드를 차원으로 추가합니다.
-
Source System
-
Change ID
-
Business Impact
이제 5개의 결과 레코드를 검사할 수 있습니다.
| Source System | Change ID | Business Impact |
|---|---|---|
| Teamwork | 10015 | Low |
| Teamwork | 10031 | Low |
| Teamwork | 10040 | None |
| Teamwork | 10103 | Medium |
| Teamwork | 50231 | - |
문제 해결 - Cross join
개요
일치하는 필드 이름이 없는 두 테이블을 조인하면 첫 번째 테이블의 모든 행이 두 번째 테이블의 모든 행과 결합되어 잠재적으로 엄청난 수의 레코드(데카르트 곱)가 생성되고 예기치 않은 데이터 연결이 발생할 수 있습니다.
로드 스크립트
TableA:
Load * inline [
A_ID, ValueA
1, foo
2, bar
];
TableB:
Join (TableA)
Load * inline [
B_ID, ValueB
10, baz
11, qux
];결과
데이터 모델 뷰어에서 미리 보기 창을 확장하면 이 전체 결과 집합의 일부가 테이블로 구성된 것을 볼 수 있습니다.
| A_ID | ValueA | B_ID | ValueB |
|---|---|---|---|
| 1 | foo | 10 | baz |
| 1 | foo | 11 | qux |
| 2 | bar | 10 | baz |
| 2 | bar | 11 | qux |
각 A_ID는 각 B_ID와 쌍을 이룹니다(총 4행).