Как я могу использовать ORDER BY с операторами LIMIT 1 несколько раз в одном и том же запросе?

Я скачал Данные OpenStreetMap от Геофабрик, где мы можем найти информацию о геометрии дорог. Я знаю, что если у меня есть случайная точка и мне нужно увидеть ближайшую дорогу от нее, я могу использовать следующий запрос в PostgreSQL:

SELECT way, osm_id 
FROM osm AS osm 
ORDER BY osm.way <-> 'SRID=3857;POINT(-3890646.5744145643 -899377.0801662721)'::GEOMETRY LIMIT 1 ;

Здесь я жестко закодировал точку POINT(-3890646.5744145643 -899377.0801662721). Этот запрос является функциональным и возвращает результат:

enter image description here

Он узнает, какая дорога ближе всего к моей точке, и дает мне osm_id этой дороги. Проблема здесь в том, что я хотел бы получить точки из другой таблицы, где у меня будет несколько геометрических точек, а не только одна. Поскольку этот запрос требует использования LIMIT 1 для работы. Какой подход я мог бы использовать для запуска того же самого запроса для каждой геометрии точек, которая у меня есть на different_table?

Я вижу, как я решил бы эту проблему, обратившись к PostgreSQL с помощью языка программирования, поскольку я мог бы сделать запрос, чтобы получить все текстовые точки из different_table, а затем я бы перебрал их все, используя мой первый запрос и получение результата один за другим. Но я не уверен, что это было бы идеальным решением. Мне нужно решение, в котором я использую только PostgreSQL... Как мне это сделать? Как я могу использовать оператор ORDER BY с LIMIT 1 несколько раз и выполнять его для каждой геометрии, которая существует в другой таблице (каждая строка будет отдельной точкой, например 'SRID=3857;POINT(-3890646.5744145643 -899377.0801662721)'::GEOMETRY)?

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно боковое соединение, которое выполняет один подзапрос один раз для каждой строки другой таблицы:

SELECT diff_id, way, osm_id, osm.way <-> diff_geog as distance
FROM different_table cross join lateral (
    select way, osm_id from osm  
    ORDER BY osm.way <-> diff_geog LIMIT 1
) osm ;

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