ERROR: ОШИБКА: в элементе предложения FROM неверная ссылка на таблицу
Когда пытаешься соединять различные таблицы в одну большую и информативную, то при работе с JOIN можно получить ошибку вида:
ERROR: ОШИБКА: в элементе предложения FROM неверная ссылка на таблицу "rz" LINE 2: JOIN (SELECT * FROM a.t_d WHERE r = rz.id LIMIT 2) AS q ON r... ^ HINT: Таблица "rz" присутствует в запросе, но сослаться на неё из этой части запроса нельзя. SQL state: 42P01 Character: 70
Соединение не случается.
Решить проблему можно при помощи слова LATERAL, которое нужно дописать сразу после JOIN. Оно позволяет учитывать столбцы и таблицы, которые существуют снаружи подзапроса. То есть подзапрос обретает видимость этих столбцов.
Из документации — Ключевое слово LATERAL
может предварять вложенный запрос SELECT
в списке FROM
. Оно позволяет обращаться в этом вложенном SELECT
к столбцам элементов FROM
, предшествующим ему в списке FROM
. (Без LATERAL
все вложенные подзапросы SELECT
обрабатываются независимо и не могут ссылаться на другие элементы списка FROM
.)
-- Отобрали по 2 записи из таблицы по условию названия корневой зоны SELECT * FROM a.t_rootzone AS rz JOIN LATERAL (SELECT * FROM a.t_d WHERE r = rz.id LIMIT 2) AS q ON rz.id = q.r LIMIT 10;
Результат соединения с использованием LATERAL для видимости.
Конкретно в этом случае мы просто отбираем все возможные столбцы по двум таблицам. Из-за этого у нас дублируются «id» и «datecreate«. Этот момент можно учесть и переписать имена столбцов на уникальные, чтобы потом при отправки этих данных на клиент мы получили ясное понимание о каких датах и идентификаторах идёт речь. Главное тут то, что LATERAL успешное произвёл соединение, которое нам нужно.
Мы делаем это для того, чтобы при соединении двух таблиц получать по две записи из второй таблицы с доменными именами. Нам не нужны все данные, нам достаточно двух штук на уникальное условие корневой зоны из первой таблицы.
Такой подход также решает проблему «Как отобрать по 3 строки (записи) таблицы по условию (по значению) в PostgreSQL?».
Информационные ссылки
PostgreSQL | CROSS JOIN для двух таблиц
Официальный сайт WEB-оболочки pgAdmin — https://www.pgadmin.org
Официальный сайт СУБД PostgreSQL — https://www.postgresql.org
Команды SQL — https://postgrespro.ru/docs/postgresql/15/sql-commands
Команда SELECT — https://postgrespro.ru/docs/postgresql/15/sql-select