Я использую шаблон Entity-Attribute-Value (EAV) для хранения «переопределений» для целевых объектов. То есть есть три таблицы:
- Сущность , содержит целевые записи
- Атрибут , содержит имена столбцов «перезаписываемых» столбцов в таблице Entity
- Переопределить , содержит записи EAV
То, что я хотел бы сделать, это выбрать Переопределения вместе со значением столбца «переопределено» из таблицы сущностей. Таким образом, требуется динамическое использование имени атрибута в SQL.
Моя наивная попытка (PostgreSQL) SQL:
SELECT
OV.entity_id as entity,
AT.name as attribute,
OV.value as value,
ENT.base_value as base_value
FROM "override" AS OV
LEFT JOIN "attribute" as AT
ON (OV.attribute_id = AT.id)
LEFT JOIN LATERAL (
SELECT
id,
AT.name as base_value -- AT.name doesn't resolve to a SQL identifier
FROM "entity"
) AS ENT
ON ENT.id = OV.entity_id;
Это не работает, поскольку AT.name
не разрешается в идентификатор SQL и просто возвращает имена столбцов, такие как 'col1', 'col2' и т. Д., А не запрашивает Entity с именем столбца.
Я знаю, что это динамический SQL, но я довольно новичок в PL / pgSQL и не могу понять, как он коррелирован / латерально соединен. Кроме того, возможно ли это, поскольку типы столбцов не являются однородно типизированными? Обратите внимание, что все «значения» в таблице переопределения хранятся в виде строк, чтобы обойти эту проблему.
Любая помощь будет наиболее ценной!