Вы ищете что-то, что не совсем легко сделать. Как правильно сказал dgw, вы должны сначала сделать домашнее задание, определив объекты вашей модели - с помощью DBIx :: Class или Rose :: DB :: Object или любого другого ORM, который вы предпочитаете. Только тогда работа с этими объектами станет тривиальной задачей, независимо от того, насколько они сложны.
Но есть и другой способ: использовать модуль SQL :: Abstract и его «расширение», SQL :: Abstract :: More. Если вам нужно только абстрагировать ваши запросы, сделать их «perlish» вместо «sqlish», я полагаю, это именно то, что доктор прописал. )
Например, ваш запрос в SQL :: Abstract :: More будет звучать так:
my ($sql, @bind) = $sqla->select(
-columns => [ qw/c.parent_id c.category_id c.name COUNT(*)/ ],
-from => [-join => qw/
categories|c
category_id=category_id product_categories|pc
product_id=product_id authorizations|a
authorization_id=authorization_id set_authorizations|sa
/],
-where => {
'a.active' => 1,
'sa.set_id' => 2,
'c.parent_id' => \["IN (SELECT category_id FROM categories WHERE parent_id IS NULL)"],
},
-group_by => [qw/ c.parent_id c.category_id c.name /],
);
Это все еще довольно грозно, хотя ... Возможно, создание VIEW со всеми объединенными таблицами сделает код (и, я полагаю, производительность) более удобочитаемым? )