Префикс 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
Right join
Этот тип объединения сохраняет все записи, которые должны быть загружены, при этом сокращая количество записей в таблице, на которую направлено объединение, только до тех записей, для которых есть совпадение ассоциации во входящих записях. Это нишевый тип объединения, который иногда используется как средство обрезки уже предварительно загруженной таблицы записей до требуемого подмножества.
Right join
Cross join
Примечание к информацииЕсли между источником и целью операции объединения нет общих имен полей, объединение приведет к декартову произведению всех строк — это называется «перекрестным объединением» (cross join).
Пример результирующего набора от операции "cross join"
Синтаксис и аргументы
[inner | outer | left | right ]Join[ (tablename )
]( loadstatement | selectstatement )
Аргументы
Аргумент
Описание
tablename
Будет выполнено сравнение именованной таблицы с загруженной таблицей.
loadstatementили selectstatement
Оператор LOAD или SELECT для загруженной таблицы.
Связанные разделы
Эти разделы могут помочь вам в работе с этой функцией:
Префикс загрузки Keep похож на префикс Join, но он не объединяет исходный и целевой наборы данных. Вместо этого он обрезает каждый набор данных в соответствии с типом принятой операции (внутреннее, внешнее, левое или правое).
Примеры скрипта загрузки - 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 ];
Этот пример демонстрирует вывод 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 с левым объединением.
Это левое объединение гарантирует, что записи изменений остаются нетронутыми, при этом добавляются атрибуты статуса там, где найдено совпадение во входящих записях статусов на основе общего 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
Если вы развернете окно предварительного просмотра в средстве просмотра модели данных, вы увидите часть этого полного результирующего набора, организованного в таблицу:
Предварительный просмотр таблицы Changes в средстве просмотра модели данных
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 ];
Если вы развернете окно предварительного просмотра в средстве просмотра модели данных, вы увидите часть полного результирующего набора, организованного в таблицу:
Предварительный просмотр таблицы в средстве просмотра модели данных
OrderID
Amount
ShipDate
2
150
2022-05-01
3
400
2022-05-02
Отображаются только OrderID 2 и 3, потому что они существуют в обеих таблицах.
Обзор
Откройте редактор загрузки данных и добавьте приведенный ниже скрипт загрузки в новый раздел.
Скрипт загрузки содержит следующее:
Набор данных, представляющий записи изменений, который загружается в таблицу с именем Changes.
Второй набор данных, представляющий записи изменений, происходящие из исходной системы JIRA. Он загружается и объединяется с исходными записями путем объединения его с префиксом загрузки Inner Join.
Это Inner Join гарантирует, что сохраняются только пять записей изменений, которые найдены в обоих наборах данных.
Скрипт загрузки
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
Теперь вы можете проверить пять результирующих записей. Результирующая таблица от 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 ];
В этом примере две таблицы, 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 ];
Этот пример демонстрирует вывод 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
-
Отображаются все клиенты.
У Кэрол нет заказов (OrderID пусто).
Обзор
Откройте редактор загрузки данных и добавьте приведенный ниже скрипт загрузки в новый раздел.
Скрипт загрузки содержит следующее:
Набор данных, представляющий записи изменений, который загружается в таблицу с именем Changes.
Второй набор данных, представляющий записи изменений, происходящие из исходной системы Teamwork. Он загружается и объединяется с исходными записями путем объединения его с префиксом загрузки Right Join.
Это гарантирует, что сохраняются только записи изменений Teamwork, при этом не теряются никакие записи Teamwork, если в целевой таблице нет соответствующего Change 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');
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
Теперь вы можете проверить пять результирующих записей.
Результирующая таблица
Source System
Change ID
Business Impact
Teamwork
10015
Low
Teamwork
10031
Low
Teamwork
10040
None
Teamwork
10103
Medium
Teamwork
50231
-
Устранение неполадок - Cross join
Обзор
Если вы объединяете две таблицы без совпадающих имен полей, каждая строка из первой таблицы будет объединена с каждой строкой из второй — потенциально создавая огромное количество записей (декартово произведение) и приводя к неожиданным ассоциациям данных.
Если вы развернете окно предварительного просмотра в средстве просмотра модели данных, вы увидите часть этого полного результирующего набора, организованного в таблицу:
Предварительный просмотр таблицы в средстве просмотра модели данных
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 строки).
Примечание к подсказкеВсегда проверяйте, что имена ваших полей совпадают должным образом, прежде чем запускать объединение.
Если вы обнаружили какую-либо проблему на этой странице или с ее содержанием — будь то опечатка, пропущенный шаг или техническая ошибка, сообщите нам об этом!