Join
Prefiks join powoduje sprzężenie załadowanej tabeli z istniejącą tabelą nazwaną lub ostatnio utworzoną tabelą danych.
Efektem łączenia danych jest rozszerzenie tabeli docelowej o dodatkowy zestaw pól lub atrybutów, a mianowicie takich, które nie są jeszcze obecne w tabeli docelowej. Wszelkie wspólne nazwy pól między zestawem danych źródłowych a tabelą docelową są używane do określenia sposobu powiązania nowych przychodzących rekordów. Jest to powszechnie określane jako „naturalne złączenie” (natural join). Operacja złączenia Qlik może prowadzić do tego, że wynikowa tabela docelowa będzie miała więcej lub mniej rekordów niż na początku, w zależności od unikalności powiązania złączenia i zastosowanego typu złączenia.
Typy złączeń
Istnieją cztery typy złączeń:
-
Left join
-
Inner join
-
Outer join
-
Right join
Przykładowe zestawy wyników z różnych typów operacji złączenia

Left join
Left join to najczęstszy typ złączenia. Na przykład, jeśli masz zestaw danych transakcyjnych i chcesz połączyć go z referencyjnym zestawem danych, zazwyczaj użyjesz Left Join. Najpierw załadujesz tabelę transakcji, a następnie załadujesz referencyjny zestaw danych, łącząc go za pomocą prefiksu Left Join z już załadowaną tabelą transakcji. Left Join zachowa wszystkie transakcje w niezmienionej formie i doda uzupełniające pola danych referencyjnych tam, gdzie znaleziono dopasowanie.
Left join

Inner join
Jeśli masz dwa zestawy danych i interesują Cię tylko wyniki, w których istnieje pasujące powiązanie, rozważ użycie Inner Join. Spowoduje to wyeliminowanie wszystkich rekordów zarówno z załadowanych danych źródłowych, jak i z tabeli docelowej, jeśli nie znaleziono dopasowania. W rezultacie tabela docelowa może mieć mniej rekordów niż przed wykonaniem operacji złączenia.
Inner join

Outer join (domyślne)
Jeśli musisz zachować zarówno rekordy docelowe, jak i wszystkie rekordy przychodzące, użyj Outer Join. Tam, gdzie nie znaleziono dopasowania, każdy zestaw rekordów jest nadal zachowywany, podczas gdy pola po przeciwnej stronie złączenia pozostaną nieuzupełnione (null).
Jeśli słowo kluczowe typu zostanie pominięte, domyślnym typem złączenia jest outer join.
Outer join

Right join
Ten typ złączenia zachowuje wszystkie rekordy, które mają zostać załadowane, jednocześnie redukując rekordy w tabeli docelowej złączenia tylko do tych rekordów, dla których istnieje dopasowanie powiązania w rekordach przychodzących. Jest to niszowy typ złączenia, który jest czasami używany jako sposób na przycięcie już wstępnie załadowanej tabeli rekordów do wymaganego podzbioru.
Right join

Cross join
Przykładowy zestaw wyników operacji "cross join"

Składnia i argumenty
[inner | outer | left | right ]Join [ (tablename ) ]( loadstatement | selectstatement )
| Argument | Opis |
|---|---|
| tablename | Tabela nazwana, która ma być porównana do załadowanej tabeli. |
| loadstatementlub selectstatement | Instrukcja LOAD lub SELECT dla załadowanej tabeli. |
Powiązane tematy
Te tematy mogą pomóc w pracy z tą funkcją:
| Temat | Opis |
|---|---|
| Łączenie tabel operatorami Join i Keep | Ten temat zawiera dalsze wyjaśnienie koncepcji „łączenia” (joining) i „zachowywania” (keeping) zestawów danych. |
| Keep | Prefiks ładowania Keep jest podobny do prefiksu Join, ale nie łączy źródłowych i docelowych zestawów danych. Zamiast tego przycina każdy zestaw danych zgodnie z typem przyjętej operacji (inner, outer, left lub right). |
Przykłady skryptu ładowania - Left join
Left join zachowuje wszystkie rekordy z głównej (docelowej) tabeli i dodaje pasujące dane z drugiej (źródłowej) tabeli. Jeśli nie ma dopasowania w źródle, rekord głównej tabeli nadal się pojawia, ale z pustymi polami z tabeli źródłowej.
Dodaj skrypt przykładowy do swojej aplikacji i uruchom go. Aby zobaczyć wynik, dodaj do arkusza w swojej aplikacji pola wyszczególnione w kolumnie wyników.
Skrypt ładowania
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 ]; Więcej informacji na temat używania ładowań wbudowanych (inline loads) można znaleźć w Używanie wbudowanych ładowań do ładowania danych.
Wyniki
| Column1 | Column2 | Column3 |
|---|---|---|
| A | B | C |
| 1 | aa | xx |
| 2 | cc | - |
| 3 | ee | - |
Ten przykład demonstruje wynik Left Join, gdzie łączone są tylko wartości obecne w pierwszej (lewej) tabeli.
Przegląd
Załóżmy, że masz listę zamówień, ale nie wszystkie zamówienia mają pasujący rekord klienta.
Skrypt ładowania
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
];Wyniki
Jeśli rozwiniesz okno podglądu w przeglądarce modelu danych, zobaczysz część pełnego zestawu wyników zorganizowaną w tabelę:
|
OrderID |
CustomerID | Amount | Name |
|---|---|---|---|
|
1 |
101 | 200 | Alice |
|
2 |
102 | 150 | Bob |
|
3 |
104 | 400 | - |
OrderID 1 i 2 mają pasujących klientów. OrderID 3 nie ma pasującego klienta, więc Name jest puste.
Przegląd
Otwórz Edytor ładowania danych i poniżej dodaj skrypt ładowania do nowej sekcji.
Skrypt ładowania zawiera:
-
Zestaw danych reprezentujący rekordy zmian, który jest ładowany do tabeli o nazwie Changes. Zawiera pole klucza Status ID.
-
Drugi zestaw danych reprezentujący statusy zmian, który jest ładowany i łączony z oryginalnymi rekordami zmian poprzez złączenie go za pomocą prefiksu ładowania left Join.
Ten left join zapewnia, że rekordy zmian pozostają nienaruszone, podczas gdy dodawane są atrybuty statusu tam, gdzie znaleziono dopasowanie w przychodzących rekordach statusu na podstawie wspólnego Status ID.
Skrypt ładowania
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');Wyniki
Otwórz przeglądarkę modelu danych i zwróć uwagę na kształt modelu danych. Obecna jest tylko jedna zdenormalizowana tabela. Jest to połączenie wszystkich oryginalnych rekordów zmian, z pasującymi atrybutami statusu dołączonymi do każdego rekordu zmiany.
|
Changes |
|---|
|
Change ID |
|
Status ID |
|
Scheduled Start Date |
|
Scheduled End Date |
|
Business Impact |
|
Status |
|
Sub Status |
Jeśli rozwiniesz okno podglądu w przeglądarce modelu danych, zobaczysz część tego pełnego zestawu wyników zorganizowaną w tabelę:
|
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 |
Ponieważ piąty wiersz w tabeli Status (Status ID: '5', Status: 'Closed', Sub Status: 'Obsolete') nie odpowiada żadnemu z rekordów w tabeli Changes, informacje w tym wierszu nie pojawiają się w powyższym zestawie wyników.
Wróć do Edytora ładowania danych. Załaduj dane i otwórz arkusz. Utwórz nową tabelę i dodaj to pole jako wymiar: Status.
Dodaj tę miarę:
=Count([Change ID])
Teraz możesz sprawdzić liczbę zmian według statusu.
| Status | =Count([Change ID]) |
|---|---|
| Open | 12 |
| Closed | 3 |
Przykłady skryptu ładowania - Inner join
Inner join zachowuje tylko rekordy, które istnieją w obu tabelach (na podstawie pasujących wartości pól).
Skrypt ładowania
Dodaj skrypt przykładowy do swojej aplikacji i uruchom go. Aby zobaczyć wynik, dodaj do arkusza w swojej aplikacji pola wyszczególnione w kolumnie wyników.
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 ];Więcej informacji na temat używania ładowań wbudowanych można znaleźć w Używanie wbudowanych ładowań do ładowania danych.
Wyniki
| Column1 | Column2 | Column3 |
|---|---|---|
| A | B | C |
| 1 | aa | xx |
Ten przykład demonstruje wynik Inner Join, gdzie łączone są tylko wartości obecne zarówno w pierwszej (lewej), jak i drugiej (prawej) tabeli.
Przegląd
Masz zamówienia i listę wysłanych zamówień. Chcesz tylko zamówienia, które zostały wysłane.
Skrypt ładowania
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
];Wyniki
Jeśli rozwiniesz okno podglądu w przeglądarce modelu danych, zobaczysz część pełnego zestawu wyników zorganizowaną w tabelę:
| OrderID | Amount | ShipDate |
|---|---|---|
| 2 | 150 | 2022-05-01 |
| 3 | 400 | 2022-05-02 |
Pojawiają się tylko OrderID 2 i 3, ponieważ istnieją w obu tabelach.
Przegląd
Otwórz Edytor ładowania danych i poniżej dodaj skrypt ładowania do nowej sekcji.
Skrypt ładowania zawiera:
-
Zestaw danych reprezentujący rekordy zmian, który jest ładowany do tabeli o nazwie Changes.
-
Drugi zestaw danych reprezentujący rekordy zmian pochodzące z systemu źródłowego JIRA. Jest on ładowany i łączony z oryginalnymi rekordami poprzez złączenie go za pomocą prefiksu ładowania Inner Join.
Ten Inner Join zapewnia, że zachowane zostaną tylko pięć rekordów zmian, które znajdują się w obu zestawach danych.
Skrypt ładowania
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');Wyniki
Załaduj dane i otwórz arkusz. Utwórz nową tabelę i dodaj te pola jako wymiary:
-
Source System
-
Change ID
-
Business Impact
Teraz możesz sprawdzić pięć wynikowych rekordów. Tabela wynikowa z Inner Join będzie zawierać tylko rekordy z pasującymi informacjami w obu zestawach danych.
| Source System | Change ID | Business Impact |
|---|---|---|
| JIRA | 10030 | None |
| JIRA | 10134 | Low |
| JIRA | 10220 | None |
| JIRA | 10323 | High |
| JIRA | 10334 | Low |
Przykłady skryptu ładowania - Outer join
Outer join zachowuje wszystkie rekordy z obu tabel. Tam, gdzie nie ma dopasowania, pola pozostają puste.
Skrypt ładowania
Dodaj skrypt przykładowy do swojej aplikacji i uruchom go. Aby zobaczyć wynik, dodaj do arkusza w swojej aplikacji pola wyszczególnione w kolumnie wyników.
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 ]; Więcej informacji na temat używania ładowań wbudowanych można znaleźć w Używanie wbudowanych ładowań do ładowania danych.
Wyniki
| Column1 | Column2 | Column3 |
|---|---|---|
| A | B | C |
| 1 | aa | xx |
| 2 | cc | - |
| 3 | ee | - |
| 4 | - | yy |
W tym przykładzie dwie tabele, Table1 i Table2, są scalane w jedną tabelę o nazwie Table1. W takich przypadkach prefiks outer jest często używany do łączenia kilku tabel w jedną w celu wykonywania agregacji na wartościach pojedynczej tabeli.
Przegląd
Chcesz uzyskać pełną listę wszystkich klientów i zamówień, nawet jeśli niektórzy klienci nie mają zamówień, a niektóre zamówienia nie mają rekordu klienta.
Skrypt ładowania
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
];Wyniki
Jeśli rozwiniesz okno podglądu w przeglądarce modelu danych, zobaczysz część tego pełnego zestawu wyników zorganizowaną w tabelę:
| OrderID | CustomerID | Name |
|---|---|---|
| 1 | 101 | Alice |
| 2 | 102 | Bob |
| 3 | 104 | - |
| - | 103 | Carol |
OrderID 3 nie ma pasującego klienta (Name puste).
CustomerID 103 (Carol) nie ma pasującego zamówienia (OrderID puste).
Przegląd
Otwórz Edytor ładowania danych i poniżej dodaj skrypt ładowania do nowej sekcji.
Skrypt ładowania zawiera:
-
Zestaw danych reprezentujący rekordy zmian, który jest ładowany do tabeli o nazwie Changes.
-
Drugi zestaw danych reprezentujący rekordy zmian pochodzące z systemu źródłowego JIRA, który jest ładowany i łączony z oryginalnymi rekordami poprzez złączenie go za pomocą prefiksu ładowania Outer Join.
Zapewnia to, że wszystkie nakładające się rekordy zmian z obu zestawów danych zostaną zachowane.
Skrypt ładowania
// 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');Wyniki
Załaduj dane i otwórz arkusz. Utwórz nową tabelę i dodaj te pola jako wymiary:
-
Source System
-
Change ID
-
Business Impact
Teraz możesz sprawdzić 10 wynikowych rekordów.
| 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 |
Przykłady skryptu ładowania - Right join
Right join zachowuje wszystkie rekordy z tabeli źródłowej i dodaje pasujące informacje z tabeli docelowej. Jeśli tabela docelowa nie ma dopasowania, pola z niej są puste.
Skrypt ładowania
Dodaj skrypt przykładowy do swojej aplikacji i uruchom go. Aby zobaczyć wynik, dodaj do arkusza w swojej aplikacji pola wyszczególnione w kolumnie wyników.
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 ];Więcej informacji na temat używania ładowań wbudowanych można znaleźć w Używanie wbudowanych ładowań do ładowania danych.
Wynik
| Column1 | Column2 | Column3 |
|---|---|---|
| A | B | C |
| 1 | aa | xx |
| 4 | - | yy |
Ten przykład demonstruje wynik Right Join, gdzie łączone są tylko wartości obecne w drugiej (prawej) tabeli.
Przegląd
Twoja tabela źródłowa to lista klientów; chcesz wszystkich klientów oraz wszelkie pasujące zamówienia.
Skrypt ładowania
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
];Wyniki
Jeśli rozwiniesz okno podglądu w przeglądarce modelu danych, zobaczysz część tego pełnego zestawu wyników zorganizowaną w tabelę:
| CustomerID | Name | OrderID |
|---|---|---|
| 101 | Alice | 1 |
| 102 | Bob | 2 |
| 103 | Carol | - |
Pojawiają się wszyscy klienci. Carol nie ma zamówień (OrderID puste).
Przegląd
Otwórz Edytor ładowania danych i poniżej dodaj skrypt ładowania do nowej sekcji.
Skrypt ładowania zawiera:
-
Zestaw danych reprezentujący rekordy zmian, który jest ładowany do tabeli o nazwie Changes.
-
Drugi zestaw danych reprezentujący rekordy zmian pochodzące z systemu źródłowego Teamwork. Jest on ładowany i łączony z oryginalnymi rekordami poprzez złączenie go za pomocą prefiksu ładowania Right Join.
Zapewnia to, że zachowane zostaną tylko rekordy zmian Teamwork, przy czym nie utracone zostaną żadne rekordy Teamwork, jeśli tabela docelowa nie ma pasującego Change ID.
Skrypt ładowania
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');Wyniki
Załaduj dane i otwórz arkusz. Utwórz nową tabelę i dodaj te pola jako wymiary:
-
Source System
-
Change ID
-
Business Impact
Teraz możesz sprawdzić pięć wynikowych rekordów.
| Source System | Change ID | Business Impact |
|---|---|---|
| Teamwork | 10015 | Low |
| Teamwork | 10031 | Low |
| Teamwork | 10040 | None |
| Teamwork | 10103 | Medium |
| Teamwork | 50231 | - |
Rozwiązywanie problemów - Cross join
Przegląd
Jeśli połączysz dwie tabele bez pasujących nazw pól, każdy wiersz z pierwszej tabeli zostanie połączony z każdym wierszem z drugiej — potencjalnie tworząc ogromną liczbę rekordów (iloczyn kartezjański) i prowadząc do nieoczekiwanych powiązań danych.
Skrypt ładowania
TableA:
Load * inline [
A_ID, ValueA
1, foo
2, bar
];
TableB:
Join (TableA)
Load * inline [
B_ID, ValueB
10, baz
11, qux
];Wyniki
Jeśli rozwiniesz okno podglądu w przeglądarce modelu danych, zobaczysz część tego pełnego zestawu wyników zorganizowaną w tabelę:
| A_ID | ValueA | B_ID | ValueB |
|---|---|---|---|
| 1 | foo | 10 | baz |
| 1 | foo | 11 | qux |
| 2 | bar | 10 | baz |
| 2 | bar | 11 | qux |
Każde A_ID jest sparowane z każdym B_ID (łącznie 4 wiersze).