Вы ищете что-то, что не очень легко сделать. Как правильно указано dgw, сначала нужно выполнить домашнюю работу, определяя объекты модели - с помощью DBIx :: Class или Rose :: DB :: Object или любого другого ORM, который вы бы одобрили. Только тогда работа с этими объектами станет тривиальной задачей, какими бы сложными они ни были.
Но есть и другой способ: использование SQL :: Abstract модуля и его расширение, SQL :: Abstract :: More. Если вам нужно только абстрагировать свои запросы, сделайте их «perlish» вместо «sqlish», я полагаю, это именно то, что доктор заказал.)
Например, запрос в SQL :: Аннотация :: Больше будет звучать так:
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 со всеми соединенными таблицами сделают код (и, я полагаю, производительность) более удобоваримый?)
У вас уже есть определения DBIx :: Class ваших таблиц и внешних ключей? – dgw