Łączenie tabel za pomocą Join i Keep
Sprzężenie to operacja polegająca na połączeniu dwóch tabel w jedną. Rekordami tabeli wynikowej są kombinacje rekordów oryginalnych tabel, zazwyczaj połączone w taki sposób, że rekordy składające się na poszczególne kombinacje w tabeli wynikowej mają wspólną wartość w jednym lub wielu polach wspólnych — jest to tzw. sprzężenie naturalne. W Qlik Sense połączenia mogą być wykonywane w skrypcie, co powoduje tworzenie tabel logicznych.
Tabele można sprzęgać bezpośrednio w skrypcie. Logika aplikacji Qlik Sense nie będzie wtedy widzieć poszczególnych tabel, tylko wynik sprzężenia w postaci pojedynczej tabeli wewnętrznej. W niektórych sytuacjach takie zachowanie jest pożądane, ale ma ono swoje wady:
- załadowane tabele często stają się większe, a aplikacja Qlik Sense działa wolniej;
- niektóre informacje mogą zostać utracone, na przykład częstotliwość (liczba rekordów) z pierwotnej tabeli.
Aby ograniczyć liczbę sytuacji wymagających jawnego sprzęgania tabel, stworzono funkcję Keep, której działanie polega na zredukowaniu jednej lub obu tabel do części wspólnej danych przed zapisaniem tych tabel w aplikacji Qlik Sense.
Złączenia w instrukcji SQL SELECT
W przypadku niektórych sterowników ODBC możliwe jest wykonanie złączenia w instrukcji SELECT. Jest to prawie równoznaczne z wykonaniem złączenia za pomocą prefiksu Join.
Jednak większość sterowników ODBC nie jest w stanie wykonać pełnego (dwukierunkowego) złączenia zewnętrznego. Mogą one wykonać tylko lewe lub prawe złączenie zewnętrzne. Lewe (prawe) złączenie zewnętrzne obejmuje tylko kombinacje, w których klucz złączenia istnieje w lewej (prawej) tabeli. Pełne złączenie zewnętrzne obejmuje dowolną kombinację. Qlik Sense automatycznie wykonuje pełne złączenie zewnętrzne.
Ponadto tworzenie złączeń w instrukcjach SELECT jest znacznie bardziej skomplikowane niż tworzenie złączeń w Qlik Sense.
SELECT DISTINCTROW
[Order Details].ProductID, [Order Details].
UnitPrice, Orders.OrderID, Orders.OrderDate, Orders.CustomerID
FROM Orders
RIGHT JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID;
Ta instrukcja SELECT łączy tabelę zawierającą zamówienia do fikcyjnej firmy z tabelą zawierającą szczegóły zamówienia. Jest to prawe złączenie zewnętrzne, co oznacza, że uwzględniane są wszystkie rekordy z OrderDetails, również te z OrderID, które nie istnieją w tabeli Orders. Zamówienia, które istnieją w Orders, ale nie w OrderDetails, nie są jednak uwzględniane.
Join
Najprostszym sposobem na wykonanie złączenia jest użycie prefiksu Join w skrypcie, który łączy tabelę wewnętrzną z inną nazwaną tabelą lub z ostatnio utworzoną tabelą. Złączenie będzie złączeniem zewnętrznym, tworzącym wszystkie możliwe kombinacje wartości z dwóch tabel.
LOAD a, b, c from table1.csv;
join LOAD a, d from table2.csv;
Wynikowa tabela wewnętrzna ma pola a, b, c i d. Liczba rekordów różni się w zależności od wartości pola z obu tabel.
Więcej informacji zawiera temat Join.
Keep
Jawny prefiks Join w skrypcie ładowania danych wykonuje pełne złączenie dwóch tabel. Wynikiem jest jedna tabela. W wielu przypadkach takie złączenia będą skutkować bardzo dużymi tabelami. Jedną z głównych cech Qlik Sense jest możliwość tworzenia asocjacji między tabelami zamiast ich łączenia, co zmniejsza ilość zajmowanego miejsca w pamięci, zwiększa szybkość i daje ogromną elastyczność. Funkcja keep została zaprojektowana w celu zmniejszenia liczby przypadków, w których konieczne jest użycie jawnych złączeń.
Prefiks Keep między dwiema instrukcjami LOAD lub SELECT powoduje zredukowanie jednej lub obu tabel do części wspólnej danych tabeli przed ich zapisaniem w Qlik Sense. Prefiks Keep musi być zawsze poprzedzony jednym ze słów kluczowych Inner, Left lub Right. Wybór rekordów z tabel odbywa się w taki sam sposób, jak w odpowiednim złączeniu. Jednak te dwie tabele nie są łączone i zostaną zapisane w Qlik Sense jako dwie oddzielnie nazwane tabele.
Więcej informacji zawiera temat Keep.
Inner
Prefiksy Join i Keep w skrypcie ładowania danych mogą być poprzedzone prefiksem Inner.
Jeśli zostanie użyty przed Join, określa, że złączenie między dwiema tabelami powinno być złączeniem wewnętrznym. Wynikowa tabela zawiera tylko kombinacje między dwiema tabelami z pełnym zestawem danych z obu stron.
Jeśli zostanie użyty przed Keep, określa, że dwie tabele powinny zostać zredukowane do ich części wspólnej przed zapisaniem w Qlik Sense.
W tych przykładach używamy tabel źródłowych Table1 i Table2:
| A | B |
|---|---|
| 1 | aa |
| 2 | cc |
| 3 | ee |
| A | C |
|---|---|
| 1 | xx |
| 4 | yy |
Inner Join
Najpierw wykonujemy Inner Join na tabelach, w wyniku czego powstaje VTable, zawierająca tylko jeden wiersz, jedyny rekord istniejący w obu tabelach, z danymi połączonymi z obu tabel.
VTable:
SELECT * from Table1;
inner join SELECT * from Table2;
| A | B | C |
|---|---|---|
| 1 | aa | xx |
Inner Keep
Jeśli zamiast tego wykonamy Inner Keep, nadal będziemy mieć dwie tabele. Obie tabele są powiązane za pomocą wspólnego pola A.
VTab1:
SELECT * from Table1;
VTab2:
inner keep SELECT * from Table2;
| A | B |
|---|---|
| 1 | aa |
| A | C |
|---|---|
| 1 | xx |
Więcej informacji zawiera temat Inner.
Left
Prefiksy Join i Keep w skrypcie ładowania danych mogą być poprzedzone prefiksem left.
Jeśli zostanie użyty przed Join, określa, że złączenie między dwiema tabelami powinno być złączeniem lewym. Wynikowa tabela zawiera tylko kombinacje między dwiema tabelami z pełnym zestawem danych z pierwszej tabeli.
Jeśli zostanie użyty przed Keep, określa, że druga tabela powinna zostać zredukowana do jej części wspólnej z pierwszą tabelą przed zapisaniem w Qlik Sense.
W tych przykładach używamy tabel źródłowych Table1 i Table2:
| A | B |
|---|---|
| 1 | aa |
| 2 | cc |
| 3 | ee |
| A | C |
|---|---|
| 1 | xx |
| 4 | yy |
Najpierw wykonujemy Left Join na tabelach, w wyniku czego powstaje VTable, zawierająca wszystkie wiersze z Table1, połączone z polami z pasujących wierszy w Table2.
VTable:
SELECT * from Table1;
left join SELECT * from Table2;
| A | B | C |
|---|---|---|
| 1 | aa | xx |
| 2 | cc | - |
| 3 | ee | - |
Jeśli zamiast tego wykonamy Left Keep, nadal będziemy mieć dwie tabele. Obie tabele są powiązane za pomocą wspólnego pola A.
VTab1:
SELECT * from Table1;
VTab2:
left keep SELECT * from Table2;
| A | B |
|---|---|
| 1 | aa |
| 2 | cc |
| 3 | ee |
| A | C |
|---|---|
| 1 | xx |
Więcej informacji zawiera temat Left.
Right
Prefiksy Join i Keep w skrypcie ładowania danych mogą być poprzedzone prefiksem right.
Jeśli zostanie użyty przed Join, określa, że złączenie między dwiema tabelami powinno być złączeniem prawym. Wynikowa tabela zawiera tylko kombinacje między dwiema tabelami z pełnym zestawem danych z drugiej tabeli.
Jeśli zostanie użyty przed Keep, określa, że pierwsza tabela powinna zostać zredukowana do jej części wspólnej z drugą tabelą przed zapisaniem w Qlik Sense.
W tych przykładach używamy tabel źródłowych Table1 i Table2:
| A | B |
|---|---|
| 1 | aa |
| 2 | cc |
| 3 | ee |
| A | C |
|---|---|
| 1 | xx |
| 4 | yy |
Najpierw wykonujemy Right Join na tabelach, w wyniku czego powstaje VTable, zawierająca wszystkie wiersze z Table2, połączone z polami z pasujących wierszy w Table1.
VTable:
SELECT * from Table1;
right join SELECT * from Table2;
| A | B | C |
|---|---|---|
| 1 | aa | xx |
| 4 | - | yy |
Jeśli zamiast tego wykonamy Right Keep, nadal będziemy mieć dwie tabele. Obie tabele są powiązane za pomocą wspólnego pola A.
VTab1:
SELECT * from Table1;
VTab2:
right keep SELECT * from Table2;
| A | B |
|---|---|
| 1 | aa |
| A | C |
|---|---|
| 1 | xx |
| 4 | yy |
Więcej informacji zawiera temat Right.