Выборка данных из нескольких слоев

Как уже упоминалось выше, в системе 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 Надписи формирует таблицу с декартовым пересечением всех трех перечисленных слоев.