родительский select возвращал больше одной колонки (делать через join пока что не получается, через массивы не очень хотелось бы делать)
2. Можно ли избежать дублирования условия возникающего в where и when ? В where оно нужно, чтобы данные выбрались, в when для того, чтобы сделать order by на основании соответствия условиям
select load.id,
(SELECT order_index,
CASE
WHEN point(pgeo.lng, pgeo.lat) <@> point(clp_orig_geo.lng, clp_orig_geo.lat) <= 10 and
dgeo.id = clp.destination_geo_id THEN 1
WHEN (point(pgeo.lng, pgeo.lat) <@> point(clp_orig_geo.lng, clp_orig_geo.lat) <= 10) THEN 2
END
as priority_type_group_suborder
FROM carrier_lane_priority as clp
INNER JOIN geo as clp_orig_geo on clp_orig_geo.id = clp.origin_geo_id
INNER JOIN geo as clp_dest_geo on clp_dest_geo.id = clp.destination_geo_id
WHERE (
(
(point(pgeo.lng, pgeo.lat) <@> point(clp_orig_geo.lng, clp_orig_geo.lat) <= 10 and
dgeo.id = clp.destination_geo_id)
or (point(pgeo.lng, pgeo.lat) <@> point(clp_orig_geo.lng, clp_orig_geo.lat) <= 10)
)
)
ORDER BY order_index
) as lane_priority
> делать через join пока что не получается, через массивы не очень хотелось бы делать Легче сделать так, чтобы получилось. ;) В чём проблема-то? > 2. Можно ли избежать дублирования условия возникающего в where и when Можно попробовать использовать вложенный запрос, например. Т.е. вычислить CASE во вложенном, во внешнем выбрать WHERE priority_type_group_suborder IS NOT NULL... но это вряд ли будет так же эффективно.
не получается приджоинить потому, что pg ругается на это select load_data.id from load_data left join load_stops as pls on load_data.id = pls.load_data_id and pls.sequence_order = 1 left join geo as pgeo on pgeo.id = pls.geo_id inner join ( SELECT carrier_id FROM carrier_lane_priority as clp INNER JOIN geo as clp_orig_geo on clp_orig_geo.id = clp.origin_geo_id WHERE (point(pgeo.lng, pgeo.lat) <@> point(clp_orig_geo.lng, clp_orig_geo.lat) <= 10) ) as clp on 95 = clp.carrier_id [42P01] ERROR: invalid reference to FROM-clause entry for table "pgeo" Hint: There is an entry for table "pgeo", but it cannot be referenced from this part of the query. Position: 420
Для этого есть LATERAL. Т.е. INNER JOIN ( → INNER JOIN LATERAL (
пасиб, помогло)))
Обсуждают сегодня