как преобразовать CTE во вложенный SELECT

#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 внутренние скобки принадлежат записи, а внешние-самой функции