Я очень новичок в PostGIS, PostgreSQL и SQL в целом.
У меня есть 44 таблицы в моей базе данных PostGIS, и каждая из них представляет отдельный слой векторных данных. Каждый был загружен из отдельного шейп-файла, и у каждого есть столбец, который описывает геометрию для этого слоя, называемыйwkb_geometry
Я хочу выбрать конкретный многоугольник на одном слое, а затем извлечь ВСЕ геометрию из поднабора слоев, которые перекрывают ограничивающий прямоугольник этого многоугольника. Я не чувствую придирчивости к выходу заказа, но было бы полезно, если бы он был организован по таблицам, из которых пришла каждая группа геометрии.
Вот пример моего оператора SQL:
SELECT
ST_AsEWKT(wkb_geometry) /* Some of this data has z values, hence the EWKT */
FROM
table2, table3, table4, table5
WHERE
wkb_geometry &&
(
SELECT
wkb_geometry
FROM
table1
WHERE
ogc_fid = 25
);
который возвращает ошибку:
column reference "wkb_geometry" is ambiguous
/* note that every table that I am selecting from has a "wkb_geometry" column */
Как правильно это сделать?
Ответы:
Прежде всего, вы получаете это сообщение об ошибке, потому что вы не указали, из какой таблицы вы хотите выбрать столбец геометрии (и так как все они имеют одинаковое имя, postgres запутывается). Вот почему вы получаете сообщение об ошибке
Если у вас одинаковое имя столбца в нескольких таблицах, всегда добавляйте имя таблицы перед именем столбца: например. table1.wkb_geometry
По вашему запросу: Если я вас правильно понял, вы хотите найти объекты в разных слоях, которые пересекают определенный объект в одном конкретном слое.
Начните смотреть на две таблицы одновременно, чтобы упростить процесс:
Table1 - таблица с конкретным объектом, table2 - таблица с другими объектами.
Теперь, если вы хотите добавить дополнительные объекты из других таблиц, вам нужен UNION ALL, как уже упоминал Sasa. Имена столбцов не обязательно должны быть одинаковыми, но количество столбцов и типы данных!
Вы можете столкнуться с проблемами при открытии запроса во вьюере, так как нет уникального идентификатора. Простой способ решить эту проблему - сохранить результат в виде таблицы со столбцом id.
веселиться
источник
У меня нет клиента SQL передо мной, так что это может быть не на 100% точно, но вам нужно что-то вроде:
и так далее. Ваша проблема в том, что SQL-запрос не знает, на какую таблицу (table2 / 3/4/5) вы ссылаетесь, когда задаете SELECT ST_AsEWKT (wkb_geometry), таким образом, неоднозначная ссылка. Вы также можете добавить ORDER BY к результатам, если хотите, чтобы они были упорядочены.
источник