Выборка данных из нескольких слоев
Как уже упоминалось выше, в системе ZuluGIS допускается выборка данных из нескольких слоев карты. При этом в результате такой выборки будет выведена таблица с декартовым пересечением запрошенных полей перечисленных слоев. Дополнительные возможности по управлению выборками из нескольких слоев предоставляет конструкция JOIN, располагающаяся в команде выборки после ключевого слоя FROM, но перед ключевыми словами WHERE, GROUP BY, HAVING и ORDER BY. В конструкции задаются условия, по которым объединяются и выводятся поля БД слоев.
В системе ZuluGIS предусмотрено несколько вариантов использования данной конструкции, каждый из которых имеет свои особенности и область применения:
INNER JOIN (внутреннее соединение)
Каждая запись данных первого слоя сопоставляется с каждой записью другого слоя на предмет выполнения условия соединения (например, выполнения условия пространственного соответствия для объектов соединяемых слоев) и выводятся все соответствующие условию записи.
Конструкция имеет следующий синтаксис: [INNER] JOIN <Слой>
ON <Условие>
, где <Слой>
— слой добавляемый к
выборке, а <Условие>
— логическое выражение по которому проводится
отбор полей. Ключевое слово INNER необязательно и может быть опущено в
команде выборки.
По результату, конструкция внутреннего соединения аналогична применению условия (с помощью ключевого слова WHERE) к выборке по нескольким слоям.
Пример применения INNER JOIN
SELECT b.Sys AS Здание, k.Sys AS Квартал FROM Здания AS b INNER JOIN Кварталы AS k ON b.Geometry.STWithin(k.geometry) ORDER BY 2
В результате данной команды выборки (конструкция b.Geometry.STWithin(k. geometry)
проверяет не находится ли объект слоя Здания
геометрически внутри объекта слоя Кварталы
, (см. «Работа с пространственными данными в
запросах») будут выведены значения полей Sys
для всех
пар объектов слоев Здание
и Квартал
в которых объект
слоя Здание
находится внутри объекта слоя Кварталы
.
Результаты сортируются по второму столбцу таблицы.
Аналогичных результатов можно добиться с использованием ключевого слова WHERE
SELECT b.Sys AS Здание, k.Sys AS Квартал FROM Здания AS b, Кварталы AS k WHERE b.Geometry.STWithin(k.geometry) ORDER BY 2
CROSS JOIN (перекрестное соединение)
Результаты применения данной конструкции в команде полностью аналогичны перечислению
названий двух слоев после ключевого слова FROM. В таблице, отображаемой в
результате выполнения выборки выводится декартово пересечение записей, в запросе будет набор
записей со всеми возможными комбинациями полей из записей первого и второго слоя, т.е.,
например при запросе поля А
из слоя содержащего 2 записи и запросе поля B
из слоя также содержащего две записи, в итоговой таблице будет четыре
записи со следующими данными: A1+B1, A1+B2, A2+B1, A2+B2
Конструкция имеет синтаксис CROSS JOIN <Слой>
.
Пример применения CROSS JOIN
SELECT * FROM Здания CROSS JOIN Кварталы
В результате выполнения команды выборки будут выведено декартово пересечение полей БД
слоев Здания
и Кварталы
.
Такой же результат будет при выполнении следующей команды выборки:
SELECT * FROM Здания, Кварталы
OUTER JOIN (внешнее соединение)
Как и в других вариантах использования конструкции JOIN в команде выборки задаются два слоя. Один после ключевого слова FROM и еще один, — в конструкции JOIN.
В результате выполнения команды выборки для одного из заданных слоев (назовем его
основным) выводятся значения для всех его записей, а для другого слоя (назовем его
дополнительным) выводятся только значения для записей соответствующих записям основного слоя
по условию заданному в конструкции
В системе ZuluGIS предусмотрено два варианта использования конструкции OUTER JOIN : LEFT OUTER JOIN (левое соединение) и RIGHT OUTER JOIN (правое соединение). В первом случае основным слоем считается слой задаваемый после ключевого слоя FROM, а во-втором — задаваемый в конструкции JOIN.
Конструкция имеет синтаксис LEFT|RIGHT [OUTER] JOIN <Слой>
ON <Условие>
, где LEFT|RIGHT — вид используемого
соединения, <Слой>
— слой добавляемый к выборке, а <Условие>
— логическое выражение по которому проводится отбор
полей. Ключевое слово OUTER необязательно и может быть опущено в команде
выборки.
Пример применения OUTER JOIN
SELECT b.sys AS Здание, k.sys AS Квартал FROM Здания AS b LEFT JOIN Кварталы AS k ON b.Geometry.STOverlaps(k.Geometry)
В результате выполнения команды выборки (конструкция b.Geometry.STOverlaps(k.Geometry)
проверяет, не пересекается ли геометрически
объект слоя Здания
с объектом слоя Кварталы
)
будут выведены поля
для всех объектов слоя Здания
и поля Sys
объектов слоя Кварталы
пересекаемых объектами слоя Здания
.
Если же выполнить команду:
SELECT b.sys AS Здание, k.sys AS Квартал FROM Здания AS b RIGHT JOIN Кварталы AS k ON b. Geometry.STOverlaps(k.geometry)
То будут выведены поля Sys
для всех объектов слоя Кварталы
, а для слоя Здания
будут выведены
только Sys
объектов пересекающих границы объектов слоя Кварталы
.
В команде выборки может последовательно использоваться несколько конструкций JOIN, в результате чего будет выполнено соединение полей из нескольких
заданных слоев. Например, команда выборки SELECT * FROM Здания CROSS JOIN Кварталы CROSS
JOIN Надписи
формирует таблицу с декартовым пересечением всех трех перечисленных
слоев.
Объединение таблиц с помощью операторов Join и Keep
Объединение — операция объединения двух таблиц в одну. Записи результирующей таблицы представляют собой комбинации записей в исходных таблицах. При этом две такие записи, составляющие одну комбинацию в результирующей таблице, как правило, имеют общее значение одного или нескольких общих полей. Такое объединение называется естественным. В программе Qlik Sense объединение может выполняться в скрипте, создавая логическую таблицу.
Таблицы, которые находятся в скрипте, можно объединять. Логика Qlik Sense будет распознавать не отдельные таблицы, а результаты объединения, которые будут представлены в одной внутренней таблице. В некоторых случаях это требуется, однако существуют недостатки:
- Загруженные таблицы часто становятся больше, и программа Qlik Sense работает медленнее.
- Некоторая информация может быть потеряна: частота (количество записей) в исходной таблице может быть больше недоступна.
Функция Keep, которая позволяет уменьшить одну или обе таблицы до пересечения данных таблиц перед сохранением таблиц в программу Qlik Sense, предназначена для уменьшения количества случаев, когда необходимо использовать явные объединения.
Примечание об информацииВ данном руководстве термин «объединение» обычно используется для объединений, выполненных до создания внутренних таблиц. Однако ассоциация, выполненная после создания внутренних таблиц, по сути, также является объединением.
Объединения внутри оператора SQL SELECT
При использовании некоторых драйверов ODBC можно выполнять объединение внутри оператора SELECT. Это практически эквивалентно созданию объединения с помощью префикса Join.
Однако большинство драйверов ODBC не позволяют сделать полное внешнее объединение (двунаправленное). Они позволяют сделать только левостороннее или правостороннее внешнее объединение. Левостороннее (правостороннее) внешнее объединение включает только сочетания, в которых в левой (правой) таблице существует ключ объединения. Полное внешнее объединение включает все сочетания. Программа Qlik Sense автоматически создает полное внешнее объединение.
Более того, создание объединений в операторах SELECT значительно сложнее, чем создание объединений в программе Qlik Sense.
Пример:
NotToTranslate»>SELECT DISTINCTROWUnitPrice, Orders.OrderID, Orders.OrderDate, Orders.CustomerID
FROM Orders
RIGHT JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID;
Этот оператор SELECT позволяет объединить таблицу, содержащую заказы несуществующей компании, и таблицу, содержащую сведения о заказах. Это правостороннее внешнее объединение, то есть будут включены все записи OrderDetails и записи со значением OrderID, которое отсутствует в таблице Orders. Однако заказы, содержащиеся в таблице Orders, но не содержащиеся в OrderDetails, не будут включены.
Join
Самым простым способом создания объединения является использование префикса Join в скрипте, который позволяет объединять внутреннюю таблицу с другой именованной таблицей или последней созданной таблицей. Объединение будет внешним и позволит создать все возможные сочетания значений из двух таблиц.
Пример:
LOAD a, b, c from table1.csv;
join LOAD a, d from table2.csv;
Результирующая внутренняя таблица имеет поля a, b, c и d. Количество записей различается в зависимости от значений полей этих двух таблиц.
Примечание об информацииИмена объединяемых полей должны совпадать. Количество объединяемых полей может быть любым. Обычно в таблицах должно быть одно или несколько общих полей. При отсутствии общих полей будет рассматриваться декартово произведение таблиц. В принципе все поля могут быть общими, однако обычно в этом нет смысла. Пока имя ранее загруженной таблицы не будет указано в операторе Join, префиксом Join будет использоваться последняя созданная таблица. Поэтому порядок двух операторов не является произвольным.
WebHelpOnly»>Для получения дополнительной информации см. Join.Keep
Явный префикс Join в скрипте загрузки данных выполняет полное объединение двух таблиц. В результате получается одна таблица. Во многих случаях такие объединения приводят к созданию очень больших таблиц. Одной из основных функций программы Qlik Sense является способность к связыванию таблиц вместо их объединения, что позволяет сократить использование памяти, повысить скорость обработки и гибкость. Функция keep предназначена для сокращения числа случаев необходимого использования явных объединений.
Префикс Keep между двумя операторами LOAD или SELECT приводит к уменьшению одной или обеих таблиц до пересечения их данных перед сохранением таблиц в программе Qlik Sense. Перед префиксом Keep следует задать одно из ключевых слов: Inner, Left или Right. Выборка записей из таблицы осуществляется так же, как и при соответствующем объединении. Однако две таблицы не объединяются и сохраняются в программе Qlik Sense в виде двух отдельных именованных таблиц.
Для получения дополнительной информации см. Keep.
Inner
Перед префиксами Join и Keep в скрипте загрузки данных можно использовать префикс Inner.
При использовании этого префикса перед префиксом Join объединение двух таблиц будет внутренним. Полученная таблица содержит только сочетания из двух таблиц, включающие полный набор данных с обеих сторон.
Если этот префикс используется перед Keep, он указывает, что две таблицы следует уменьшить до области взаимного пересечения, прежде чем они смогут быть сохранены в программе Qlik Sense.
Пример:
В этих таблицах используются исходные таблицы Table1 и Table2:
A | B |
---|---|
1 | aa |
2 | cc |
3 | ee |
A | C |
---|---|
1 | xx |
4 | yy |
Inner Join
Сначала выполняется Inner Join в отношении таблиц, в результате чего образуется таблица VTable, содержащая только одну строку, только одну запись, существующую в обеих таблицах, с данными из обеих таблиц.
VTable:
SELECT * from Table1;
inner join SELECT * from Table2;
A | B | C |
---|---|---|
1 | aa | xx |
Inner Keep
Если вместо этого выполняется Inner Keep, таблиц все равно будет две. Две таблицы связаны посредством общего поля A.
VTab1:
SELECT * from Table1;
VTab2:
inner keep SELECT * from Table2;
A | B |
---|---|
1 | aa |
A | C |
---|---|
1 | xx |
Left
Перед префиксами Join и Keep в скрипте загрузки данных можно использовать префикс left.
При использовании этого префикса перед префиксом Join объединение двух таблиц будет левосторонним. Полученная таблица содержит только сочетания из двух таблиц, включающие полный набор данных из первой таблицы.
Если этот префикс используется перед префиксом Keep, он указывает, что вторую таблицу следует уменьшить до области взаимного пересечения с первой таблицей перед сохранением в программе Qlik Sense.
Пример:
В этих таблицах используются исходные таблицы Table1 и Table2:
A | B |
---|---|
1 | aa |
2 | cc |
3 | ee |
A | C |
---|---|
1 | xx |
4 | yy |
Сначала выполняется Left Join в отношении таблиц, в результате чего образуется таблица VTable, содержащая все строки из таблицы Table1, совмещенные с полями из совпадающих строк в таблице Table2.
VTable:
SELECT * from Table1;
left join SELECT * from Table2;
A | B | C |
---|---|---|
1 | aa | xx |
2 | cc | — |
3 | ee | — |
Если вместо этого выполняется Left Keep, таблиц все равно будет две. Две таблицы связаны посредством общего поля A.
VTab1:
SELECT * from Table1;
VTab2:
left keep SELECT * from Table2;
A | B |
---|---|
1 | aa |
2 | cc |
3 | ee |
A | C |
---|---|
1 | xx |
Для получения дополнительной информации см. Left.
Right
Перед префиксами Join и Keep в скрипте загрузки данных можно использовать префикс right.
При использовании этого префикса перед префиксом Join объединение двух таблиц будет правосторонним. Полученная таблица содержит только сочетания из двух таблиц, включающие полный набор данных из второй таблицы.
Если этот префикс используется перед префиксом Keep, он указывает, что первую таблицу следует уменьшить до области взаимного пересечения со второй таблицей перед сохранением в программе Qlik Sense.
Пример:
В этих таблицах используются исходные таблицы Table1 и Table2:
A | B |
---|---|
1 | aa |
2 | cc |
3 | ee |
A | C |
---|---|
1 | xx |
4 | yy |
Сначала выполняется Right Join в отношении таблиц, в результате чего образуется таблица VTable, содержащая все строки из таблицы Table2, совмещенные с полями из совпадающих строк в таблице Table1.
VTable:
SELECT * from Table1;
right join SELECT * from Table2;
A | B | C |
---|---|---|
1 | aa | xx |
4 | — | yy |
Если вместо этого выполняется Right Keep, таблиц все равно будет две. Две таблицы связаны посредством общего поля A.
VTab1:
SELECT * from Table1;
VTab2:
right keep SELECT * from Table2;
A | B |
---|---|
1 | aa |
A | C |
---|---|
1 | xx |
4 | yy |
Для получения дополнительной информации см. Right.
СинтаксисJOIN — База знаний MariaDB
Описание
MariaDB поддерживает следующие синтаксисы JOIN
для
часть table_references
оператора SELECT
и
несколько таблиц DELETE
и UPDATE
операторы:
table_references: таблица_ссылка [ таблица_ссылка] . .. таблица_ссылка: таблица_фактор | join_table таблица_фактор: имя_таблицы [РАЗДЕЛ (список_разделов)] [query_system_time_period_specification] [[AS] псевдоним] [index_hint_list] | table_subquery [query_system_time_period_specification] [AS] псевдоним | ( таблица_ссылки ) | { ON table_reference ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ table_reference ON условное_выражение } присоединяемая_таблица: table_reference [ВНУТРЕННЯЯ | CROSS] JOIN table_factor [состояние_соединения] | table_reference STRAIGHT_JOIN table_factor | table_reference STRAIGHT_JOIN table_factor ON conditional_expr | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_condition | table_reference NATURAL [{LEFT|RIGHT} [OUTER]] JOIN table_factor условие_присоединения: ВКЛ условное_выражение | ИСПОЛЬЗОВАНИЕ (column_list) query_system_time_period_specification: ДЛЯ SYSTEM_TIME НА ТОЧКУ_В_ВРЕМЕНИ | ДЛЯ SYSTEM_TIME МЕЖДУ point_in_time И point_in_time | ЗА СИСТЕМНОЕ_ВРЕМЯ С момента_в_времени ДО момента_в_времени | ДЛЯ SYSTEM_TIME ВСЕХ точка_в_времени: [TIMESTAMP] выражение | ТРАНЗАКЦИЯ выражение index_hint_list: подсказка_индекса [ подсказка_индекса] . .. index_hint: ИСПОЛЬЗОВАТЬ {ИНДЕКС|КЛЮЧ} [{ДЛЯ {ПРИСОЕДИНЕНИЯ|ЗАКАЗАТЬ ПО|ГРУППИРОВАТЬ ПО}] ([список_индексов]) | ИГНОРИРОВАТЬ {ИНДЕКС|КЛЮЧ} [{FOR {JOIN|ORDER BY|GROUP BY}] (список_индексов) | ПРИНУДИТЕЛЬНО {ИНДЕКС|КЛЮЧ} [{FOR {JOIN|ORDER BY|GROUP BY}] (список_индексов) список_индексов: имя_индекса [ имя_индекса] ...
Ссылка на таблицу также известна как выражение соединения.
Каждая таблица также может быть указана как db_name
. имя_таблицы
. Это позволяет писать запросы, которые включают несколько баз данных. Подробные сведения о синтаксисе см. в разделе Квалификаторы идентификаторов.
Синтаксис table_factor
расширен по сравнению с
Стандарт SQL. Последний принимает только table_reference
, а не
список их внутри пары круглых скобок.
Это консервативное расширение, если мы рассмотрим каждую запятую в списке элементы table_reference как эквивалентные внутреннему объединению. Например:
ВЫБЕРИТЕ * ИЗ t1 ЛЕВОЕ СОЕДИНЕНИЕ (t2, t3, t4) ВКЛ (t2.a=t1.a И t3.b=t1.b И t4.c=t1.c)
эквивалентно:
ВЫБРАТЬ * ИЗ t1 ЛЕВОЕ СОЕДИНЕНИЕ (t2 ПОПЕРЕЧНОЕ СОЕДИНЕНИЕ t3 ПОПЕРЕЧНОЕ СОЕДИНЕНИЕ t4) ВКЛ (t2.a=t1.a И t3.b=t1.b И t4.c=t1.c)
В MariaDB CROSS JOIN
является синтаксическим эквивалентом INNER JOIN
(они могут заменять друг друга). В стандартном SQL
они не эквивалентны. INNER JOIN
используется с НА
, в противном случае используется CROSS JOIN
.
Как правило, круглые скобки можно игнорировать в выражениях соединения, содержащих только операции внутреннего соединения. MariaDB также поддерживает вложенные соединения (см. http://dev.mysql.com/doc/refman/5.1/en/nested-join-optimization.html).
Дополнительную информацию см. в разделе Таблицы версий системы.
о синтаксисе FOR SYSTEM_TIME
.
Можно указать подсказки индекса, чтобы повлиять на то, как оптимизатор MariaDB делает использование индексов. Дополнительные сведения см. в разделе Как принудительно выполнить планы запросов.
Примеры
SELECT left_tbl.* FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id ГДЕ right_tbl.id имеет значение NULL;
Комментарии
Содержание, воспроизведенное на этом сайте, является собственностью его соответствующих владельцев, и этот контент не проверяется заранее MariaDB. Взгляды, информация и мнения выраженные в этом контенте, не обязательно представляют собой материалы MariaDB или любой другой стороны.
SQL Соединение двух таблиц | Различные типы соединений для таблиц с примерами
Давайте обсудим объединение двух таблиц вместе с синтаксисом и примерами. Давайте рассмотрим таблицу «Ссуда» и таблицу «Заемщик» и применим все типы соединений, такие как приведенные ниже типы. Ниже приведены различные типы соединений, которые мы собираемся применить к таблицам:
Различные типы соединений
- ВНУТРЕННЕЕ соединение .
- ВЛЕВО Соединить
- ПРАВО Присоединиться
- ПОЛНОЕ соединение
a) INNER Join: Внутреннее объединение получает все строки, которые являются общими в обеих таблицах, на основе указанного условия. Возьмем пример внутреннего соединения.
Синтаксис:
SELECT * FROM TABLE_A A
INNER JOIN TABLE_B B
ON A. Common_COLUMN =B. Common_COLUMN
б) LEFT JOIN: Левое соединение получает все строки из левой таблицы и общие строки обеих таблиц. Возьмем пример левого соединения.
Синтаксис:
SELECT * FROM TABLE_A A
LEFT JOIN TABLE_B B
ON A. Common_COLUMN =B. Common_COLUMN
c) ПРАВОЕ СОЕДИНЕНИЕ: Правое соединение получает все строки из правой таблицы и общие строки обеих таблиц. Возьмем пример правильного соединения.
Синтаксис:
SELECT * FROM TABLE_A A
RIGHT JOIN TABLE_B B
ON A. Common_COLUMN=B.Common_COLUMN
IN d: 9 FULL0076 Full Join получает все строки из обеих таблиц. Возьмем пример правильного соединения.
Синтаксис:
SELECT * FROM TABLE_A A
FULL JOIN TABLE_B B
ON A. Common_COLUMN =B. Common_COLUMN
Результирующий набор содержит значения NULL. Нижеследующий синтаксис может использоваться для игнорирования значений NULL: –
SELECT * FROM TABLE_A A
FULL JOIN TABLE B B
ON A. Common_COLUMN =B. Common_COLUMN
ГДЕ A.Common_COLUMN IS NULL
AND A.Common_COLUMN IS NULL
Как соединить две таблицы?
1. Левое соединение
Левое соединение = все строки из левой таблицы + ВНУТРЕННЕЕ соединение
Пример
Рассмотрим две таблицы и применим к ним левое соединение:
Заемщик:
Запрос для получения номера_кредита, статуса и даты заемщика из двух таблиц: –
Запрос:
ВЫБЕРИТЕ L. LOAN_NO, L.LOAN_STATUS,B.BORROWER_DATE
FROM LOAN L LEFT JOIN BORROWER B
ON L.LOAN_NO=B.LOAN_NO
Давайте проверим вывод приведенной выше таблицы после применения левого соединения их.
Ниже скриншот:
2. ПРАВОЕ соединение
- ПРАВОЕ соединение = все строки из таблицы ПРАВО + ВНУТРЕННЕЕ соединение
- Считать все строки из правой таблицы и общие из обеих таблиц.
- Соединения на основе условия Ключевое слово
- ON используется для указания условия и объединения таблиц.
Пример
- Рассмотрим две таблицы и применим к ним ПРАВОЕ соединение: –
- Запрос для получения номера_кредита, статуса и даты заемщика из двух таблиц: –
Запрос:
ВЫБЕРИТЕ L.LOAN_NO, L.LOAN_STATUS, B.BORROWER_DATE
ИЗ КРЕДИТА L ПРАВО ПРИСОЕДИНИТЬСЯ К ЗАЕМЩИКУ B
ON L.LOAN_NO=B.LOAN_NO
Давайте проверим вывод приведенной выше таблицы после применения к ним правильного соединения.
Вывод:
Ниже скриншот:
3. ВНУТРЕННЕЕ Соединение
Внутреннее Соединение = Все общие строки из обеих таблиц. При объединении хотя бы один столбец должен иметь одинаковый тип данных и общий для таблиц.
Пример
- Рассмотрим две таблицы и применим к ним соединение INNER: –
- Построим запрос, чтобы получить номер_кредита, статус и дату заемщика из двух таблиц: —
Запрос:
ВЫБЕРИТЕ L.LOAN_NO, L.LOAN_STATUS, B.BORROWER_DATE
применяя к ним внутреннее соединение.
FROM LOAN L INNER JOIN BORROWER B
ON L.LOAN_NO=B.LOAN_NO После проверки приведенной выше таблицы
Здесь в приведенном выше выводе мы получили общие строки обеих таблиц на основе условия «L.LOAN_NO=B.LOAN_NO».
Скриншот ниже:
4. ПОЛНОЕ ВНЕШНЕЕ Соединение
ПОЛНОЕ ВНЕШНЕЕ Соединение = Все строки из обеих таблиц. При объединении хотя бы один столбец должен иметь одинаковый тип данных и общий для таблиц.
Пример
- Рассмотрим две таблицы и применим к ним ПОЛНОЕ ВНЕШНЕЕ соединение: –
- Построим запрос для получения ap_date и даты заемщика из двух таблиц: –
Запрос:
SELECT L.LOAN_NO,B.BORROWER_DATE
FROM LOAN L FULL OUTER JOIN BORROWER B
ON L.LOAN_NO=B.LOAN_NO
Давайте проверим вывод таблицы выше после применения к ним внутреннего соединения.
Вывод:
Скриншот ниже:
Заключение
Чтобы получить данные, соответствующие требованию клиента, нам может понадобиться объединить таблицы, которые будут выполняться путем объединения. Как упоминалось ранее, соединения используются для получения данных из более чем одной таблицы. Чтобы объединить более одной таблицы, нам нужен хотя бы один столбец, общий для обеих таблиц.