Как уже упоминалось выше, в системе 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.
В результате выполнения команды выборки для одного из заданных слоев (назовем его основным) выводятся значения для всех его записей, а для другого слоя (назовем его дополнительным) выводятся только значения для записей соответствующих записям основного слоя по условию заданному в конструкции 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
для всех объектов слоя
Здания
и поля 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 Надписи
формирует таблицу с декартовым пересечением всех трех перечисленных
слоев.