Более

Sql-запрос в Postgresql

Sql-запрос в Postgresql


Я пытаюсь выполнить запрос, но застрял. У меня есть две таблицы A и B. В таблице есть столбцы gid, geometry (строка-строка) и значение, ячейки которого пусты, в таблице B есть 3 столбца gid, geometry (Point) и km. Я хочу найти из таблицы A начальную и конечную точку каждой строки строки и сравнить с точками таблицы B, если начальная и конечная точки строки строки совпадают с точками из таблицы B, тогда я хочу сравнить значения начальных и конечных точек, которые соответствуют одной точке для начала и одной для конца, и сохраните большее значение в пустом столбце таблицы A.

Это тот запрос, который я использую.

SELECT * FROM r, e, где ST_Equals (ST_Startpoint (r.geom) ,. geo) LIMIT 10;

Но я не получил результат выполнения запроса


В Postgres имена столбцов и таблиц нечувствительный к регистру и все преобразуется в нижний регистр перед выполнением запроса, см. документацию. Следовательно,

ВЫБРАТЬ SomeColumn из SomeTable

становится

ВЫБЕРИТЕ столбец из таблицы

если вы не напишете это как

ВЫБЕРИТЕ "SomeColumn" ИЗ "SomeTable"

На мой взгляд, это беспорядок, особенно при работе с клиентами SQL, поскольку вам также придется избегать кавычек, поэтому лучше всего с самого начала использовать имена таблиц / столбцов в нижнем регистре. Если вы не можете это изменить, то в вашем случае строку с нарушением можно переписать следующим образом:

FROM r INNER JOIN e ON (r. "StartX" = e. "X" AND r. "StartY" = e. "Y") OR (r. "EndX" = e. "X" AND r. "EndY" = е. "Y");

Я бы также посоветовал вам не использовать псевдонимы таблицы в нижнем регистре, например r или e, как R и E, иначе вам придется их цитировать, и это также не сделает запрос более четким или короче.

Короче говоря, в Postgres используйте верхний регистр для таких ключевых слов, как SELECT, FROM, JOIN и нижний регистр для всего остального.

С другой стороны,ST_Xвозвращает число, поэтомуST_X (ST_AsTEXT(…)) Также не сработает, если вы исправите проблему с верхним регистром. Просто используйтеST_X (ST_Transfrom (geom, 4326))Например.


Поскольку вы ищете только идентичные точки, оператор пересечения ограничивающих прямоугольников «&&» будет наиболее эффективным. Если у ваших таблиц нет пространственных индексов, создайте их:

СОЗДАТЬ ИНДЕКС ПО r ИСПОЛЬЗУЯ gist (geom); СОЗДАТЬ ИНДЕКС ПО ИСПОЛЬЗОВАНИЮ gist (geo);

Затем для каждой строки поиска соответствующие конечные точки и большее значение km:

ОБНОВЛЕНИЕ r УСТАНОВИТЕ значение = наибольшее (e1.km, e2.km) ОТ e e1, e e2 ГДЕ e1.geo && ST_StartPoint (r.geom) И e2.geo && ST_EndPoint (r.geom));

Это даст правильные результаты только в том случае, если каждая начальная и конечная точка будет найдена в вашей таблице ровно один раз. E.


Смотреть видео: Уроки SQL. Иерархические рекурсивные запросы. Илья Хохлов