#sql #postgresql #postgis #common-table-expression
Вопрос:
у меня есть приведенный ниже запрос. я хотел бы использовать вложенный SELECT
оператор вместо CTE
. я хотел бы, чтобы во внешнем SELECT
заявлении указывались столбцы, содержащиеся в таблице grid_cell_data
, которую я не хочу использовать j.*
, вместо этого я хочу использовать имена столбцов
запрос:
WITH j AS (
SELECT
ST_AsMVTGeom(
st_geomfromtext(geometryofcellrepresentativetobuffer),
ST_MakeBox2D(ST_Point(0, 0), ST_Point(4096,4096)))
FROM grid_cell_data where id = 3
)
SELECT ST_AsMVT(j.*) FROM j
таблица grid_cell_data
CREATE TABLE IF NOT EXISTS grid_cell_data (
id SERIAL PRIMARY KEY,
isTreatment boolean,
isBuffer boolean,
geometryOfCellRepresentativeToTreatment geometry,
geometryOfCellRepresentativeToBuffer geometry
)
Комментарии:
1. и в чем же заключается вопрос? Почему вы не можете переместить CTE на подселение ? Просто скопируйте
j AS (....)
из CTE в часть «ОТ», как(...) as j
вместоj
. Кажется, все прямолинейно.
Ответ №1:
Вам просто нужно выбрать все необходимые записи в CTE/подзапросе, а во внешнем запросе вы можете продолжать использовать j
или j.*
. В случае, если вам необходимо дополнительно выбрать определенные столбцы , поместите их между круглыми скобками в поле SELECT
, чтобы оно представляло запись ST_AsMVT
, например
WITH j AS (
SELECT *,
ST_AsMVTGeom(
st_geomfromtext(geometryofcellrepresentativetobuffer),
ST_MakeBox2D(ST_Point(0, 0), ST_Point(4096,4096))) AS mvt_geom
FROM grid_cell_data where id = 3
)
SELECT ST_AsMVT((id,isTreatment,isBuffer,mvt_geom))
FROM j
Комментарии:
1. не могли бы вы, пожалуйста, сказать мне, зачем нам нужно (( и )) для st_asmvt?я знаю, что для этого требуется строка, а не отдельная argument..is это как postgresql преобразует аргументы в строку?
2. можно ли заменить первый * также столбцами, представляющими мой интерес?
3. @LetsamrIt первый вопрос: столбцы , разделенные запятой между круглыми скобками, означают a
record
, что и ожидает функция. второй вопрос: да, это возможно. вы можете сделать это обоими способами4. вы имеете в виду между двойными скобками, как (()), а не между одной, я прав?
5. @LetsamrIt внутренние скобки принадлежат записи, а внешние-самой функции