Как проверить значение возрастающего упорядоченного столбца в предложении where в postgresql?

Я новичок в postgresql. Я хочу объединить две таблицы, если одна геометрия первой таблицы содержится в геометрии второй таблицы. Итак, я написал и выполнил эту часть запроса следующим образом, и она работает нормально.

select edge.start_id, cls.gid 
from edge_table edge 
   inner join cluster_info cls on st_contains(cls.geom,st_setsrid(edge.start_geom,3067));

Но он дает start_id и содержащий его идентификатор geom (как упоминалось в запросе cls.gid) в случайном порядке, например:

start_id gid
26040   2493
43323   2490
26208   2400
42754   2433
43537   2434
1379    2434
43570   2904
42887   2475
43689   2495
43211   2904

Но мне нужно вставить результат в другой столбец с именем start_cls в моей таблице ребер. Мне нужно определить строку, в которую должен быть вставлен cls.gid. Итак, мне нужно проверить значение start_id для каждой строки, и cls.gid, соответствующий этому start_id, должен быть помещен в эту строку. Предположим, четыре строки моей таблицы ребер следующие:

gid start_id    end_id  start_geom                                  end_geom                                    start_cls     end_cls
1   81608       81608   01010000007368912D8B622341E5D022EBEAF65A41  01010000007368912D8B622341E5D022EBEAF65A41                  
2   81557       81520   010100000085EB51F89C0723418B6CE7DB9F8E5A41  0101000000986E1203DE0723416DE7FB51A38E5A41                  
3   189898      80812   01010000006F1283C0A093214179E926F1A1005B41  0101000000BE9F1A6FF3942141022B871EEC005B41                  
4   80952       80476   0101000000666666E67F832341F2D24DBA38B45A41  0101000000736891EDB48423413BDF4F755AB45A41

Мне нужно сначала заполнить столбец start_cls. Таким образом, значение cls.gid 81608 (первый start_id) должно быть в первой строке столбца start_cls. Итак, я дал следующее предложение where следующим образом:

select edge.start_id, cls.gid 
from edge_table edge 
  inner join cluster_info cls on st_contains(cls.geom,st_setsrid(edge.start_geom,3067))
where (select start_id from edge_table) = edge.start_id;

Но это дает следующую ошибку:

ERROR:  more than one row returned by a subquery used as an expression
********** Error **********

ERROR: more than one row returned by a subquery used as an expression
SQL state: 21000

Я попытался с помощью следующего запроса, но не повезло.

select edge.start_id, cls.gid 
from edge_table edge 
   inner join cluster_info cls on st_contains(cls.geom,st_setsrid(edge.start_geom,3067))

where (select start 
       from (select start_id as start 
             from edge_table) as s) = edge.start_id;

Пожалуйста, помогите с этим запросом. Он имеет некоторую геометрическую часть, но основная проблема заключается в организации запросов postgresql. Итак, я поднял этот вопрос в stackru вместо gis.stackexchange.

0 ответов

Другие вопросы по тегам