PostgreSQL | Таблица присутствует в запросе, но сослаться на неё из этой части запроса нельзя.

PostgreSQL | Таблица присутствует в запросе, но сослаться на неё из этой части запроса нельзя.

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

Соединение не случается.

Таблица -rz- присутствует в запросе, но сослаться на неё из этой части запроса нельзя - ошибка PostgreSQL
Таблица -rz- присутствует в запросе, но сослаться на неё из этой части запроса нельзя — ошибка PostgreSQL

Решить проблему можно при помощи слова 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 для видимости.

Использование JOIN LATERAL для нормальной ссылки на столбцы в подзапросе - PostgreSQL
Использование JOIN LATERAL для нормальной ссылки на столбцы в подзапросе — PostgreSQL

Конкретно в этом случае мы просто отбираем все возможные столбцы по двум таблицам. Из-за этого у нас дублируются «id» и «datecreate«. Этот момент можно учесть и переписать имена столбцов на уникальные, чтобы потом при отправки этих данных на клиент мы получили ясное понимание о каких датах и идентификаторах идёт речь. Главное тут то, что LATERAL успешное произвёл соединение, которое нам нужно.

Мы делаем это для того, чтобы при соединении двух таблиц получать по две записи из второй таблицы с доменными именами. Нам не нужны все данные, нам достаточно двух штук на уникальное условие корневой зоны из первой таблицы.

Такой подход также решает проблему «Как отобрать по 3 строки (записи) таблицы по условию (по значению) в PostgreSQL?».

 

Информационные ссылки

PostgreSQL | CROSS JOIN для двух таблиц

Официальный сайт WEB-оболочки pgAdminhttps://www.pgadmin.org

Официальный сайт СУБД PostgreSQLhttps://www.postgresql.org

Команды SQLhttps://postgrespro.ru/docs/postgresql/15/sql-commands

Команда SELECThttps://postgrespro.ru/docs/postgresql/15/sql-select