Вы используете антипаттерн EAV. Это нарушает всевозможные правила проектирования реляционных баз данных, и, как вы обнаружили, получение данных очень неудобно. Есть много других недостатков этой конструкции, описанных в другом месте.
Прочтите статью " Bad CaRMa ", чтобы узнать, как система EAV разрушила компанию.
Вот что вам нужно сделать, чтобы получить атрибуты маршрутизатора из вашей базы данных:
SELECT e.name AS "element",
speedval.value AS "speed",
ipval.value AS "IP",
portsval.value AS "Ports"
FROM hwtype t
JOIN hwelement e ON (e.idhwtype = t.id)
JOIN hwattributes speed ON (speed.idhwtype = t.id AND speed.name = 'speed')
LEFT OUTER JOIN hwtypeattributes speedval
ON (speedval.idhwattribute = speed.id AND speedval.idhwelement = e.id)
JOIN hwattributes ip ON (ip.idhwtype = t.id AND ip.name = 'ip')
LEFT OUTER JOIN hwtypeattributes ipval
ON (ipval.idhwattribute = ip.id AND ipval.idhwelement = e.id)
JOIN hwattributes ports ON (ports.idhwtype = t.id AND ports.name = 'ports')
LEFT OUTER JOIN hwtypeattributes portsval
ON (portsval.idhwattribute = ports.id AND portsval.idhwelement = e.id)
WHERE t.name = 'router';
Обратите внимание, что вам нужна дополнительная пара соединений для каждого атрибута , если вы настаиваете на получении всех атрибутов для данного элемента в одной строке. Это быстро становится чрезмерно дорогим для оптимизатора SQL.
Гораздо проще извлечь атрибуты из нескольких строк и отсортировать их в коде приложения:
SELECT e.name AS "element", a.name, v.value
FROM hwtype t
JOIN hwelement e ON (e.idhwtype = t.id)
JOIN hwattributes a ON (a.idhwtype = t.id)
JOIN hwtypeattributes v ON (v.idhwattribute = a.id AND v.idhwelement = e.id)
WHERE t.name = 'router';