ST_Intersect - more than 1 row returned by subquery

Ответить
Аватара пользователя
SS_Rebelious
Гуру
Сообщения: 1304
Зарегистрирован: 24 фев 2009, 16:51
Репутация: 99
Ваше звание: GIS pro-fan
Откуда: Lahti / Газ-ПУТИНбург
Контактная информация:

ST_Intersect - more than 1 row returned by subquery

Сообщение SS_Rebelious » 24 апр 2012, 03:16

Пытаюсь выбрать колонку таблицы объектов, попадающих в буфер:

Код: Выделить всё

SELECT dumps.land_category
FROM dumps, water_line
WHERE  ST_Intersects (dumps.geom, 
                              (SELECT ST_Buffer (water_line.geom, 100, 'endcap=flat join=round')
                               FROM water_line))
Получаю ошибку: ERROR: more than one row returned by a subquery used as an expression
SQL state: 21000

При этом

Код: Выделить всё

SELECT ST_Buffer (water_line.geom, 100, 'endcap=flat join=round')
FROM water_line
выполняется успешно.

Где я накосячил?
Последний раз редактировалось SS_Rebelious 25 апр 2012, 21:19, всего редактировалось 1 раз.
Look for something long enough, and you will find it. Look for something without understanding, and it will find you...
"All paid jobs absorb and degrade the mind." Aristotle
If you take 1 step towards freedom it'll take 2 steps towards you!

Аватара пользователя
Aleksandr Dezhin
Активный участник
Сообщения: 244
Зарегистрирован: 03 фев 2010, 10:47
Репутация: 14
Откуда: Москва

Re: ST_Intersect - more than 1 row returned by subquery

Сообщение Aleksandr Dezhin » 24 апр 2012, 03:38

По всей видимости проблема в том, что поздапрос, который сам по себе работает, возвращает несколько строк, которые неизвестно как обрабатывать - грубо говоря в общем случае не ясно что к ним применить - то-ли and то-ли or то-ли еще что. Я бы для начала переписал как-то так:

Код: Выделить всё

SELECT dumps.land_category
FROM dumps
WHERE  EXISTS (
    SELECT * FROM water_line
    WHERE ST_Intersects(dumps.geom, ST_Buffer(water_line.geom, 100, 'endcap=flat join=round'))
)
Если же подзапрос возвращает одну строку, то проблема вот тут:

Код: Выделить всё

FROM dumps, water_line
если water_line нужен только для позапроса, то тут он лишний. Если не только - то нужно использовать JOIN или так:

Код: Выделить всё

SELECT dumps.land_category, water_geom.foo, water_geom.bar
FROM dumps, water_line
WHERE  ST_Intersects (dumps.geom, ST_Buffer (water_line.geom, 100, 'endcap=flat join=round'))

Аватара пользователя
SS_Rebelious
Гуру
Сообщения: 1304
Зарегистрирован: 24 фев 2009, 16:51
Репутация: 99
Ваше звание: GIS pro-fan
Откуда: Lahti / Газ-ПУТИНбург
Контактная информация:

Re: ST_Intersect - more than 1 row returned by subquery

Сообщение SS_Rebelious » 25 апр 2012, 21:19

Спасибо, заработало!
Look for something long enough, and you will find it. Look for something without understanding, and it will find you...
"All paid jobs absorb and degrade the mind." Aristotle
If you take 1 step towards freedom it'll take 2 steps towards you!

Ответить

Вернуться в «PostGIS/PostgreSQL»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей