2016-10-04 5 views
0

У меня есть простой запрос PostgreSQL. У меня проблемы с переводом в slick-запрос. Я использую groupBy.Сложное преобразование простого запроса PostgreSQL в Slick-запрос

SELECT u.id AS investor_id, 
     u.account_type, 
     i.first_name, 
     issuer_user.display_name AS issuer_name, 
     p.legal_name AS product_name, 
     v.investment_date, 
     iaa.as_of AS CCO_approval_date, 
     v.starting_investment_amount, 
     v.maturity_date, 
     v.product_interest_rate, 
     v.product_term_length, 
     i.user_information_id, 
     v.id AS investment_id 
FROM investors u 
JOIN 
    (SELECT ipi.investor_id, 
      ipi.first_name, 
      ipi.user_information_id 
    FROM investor_personal_information ipi 
    JOIN 
    (SELECT investor_id, 
       MAX(id) AS Max_Id 
     FROM investor_personal_information 
     GROUP BY investor_id) M ON ipi.investor_id = m.investor_id 
    AND ipi.id = m.Max_Id) i ON u.id = i.investor_id 
JOIN investments v ON u.id = v.investor_id 
JOIN sub_products AS sp ON v.sub_product_id = sp.id 
JOIN products AS p ON p.id = sp.product_id 
JOIN company AS c ON c.id = p.company_id 
JOIN issuers AS issuer ON issuer.id = c.issuer_id 
JOIN users AS issuer_user ON issuer.owner = issuer_user.id 
JOIN investment_admin_approvals AS iaa ON iaa.investment_id = v.id 
ORDER BY i.first_name DESC; 

Я начал писать это

val query = { 
    val investorInfoQuery = (for { 
    i <- InvestorPersonalInformation 
    } yield (i)).groupBy { 
    _.investorId 
    }.map { 
    case (id, rest) => { 
     id -> rest.map(_.id).max 
    } 
    } 
} 

Я знаю, что для создания базовых запросов в один большой запрос и применить присоединяется на них отдельно. Может ли кто-нибудь помочь мне или предоставить мне несколько примеров? Слик тяжелый.

+0

Одним из вариантов является простой SQL в slick. Вы можете использовать свой существующий sql и сопоставить его с типом результата с использованием slick. –

ответ

0

Выглядит довольно просто, чтобы написать. Я не собираюсь помогать вам писать весь запрос, я просто приведу вам пример, который вы можете выполнить, чтобы ответить на ваш запрос.

Допустим, вы были следующие структуры и соответствующие запросы таблица определяется как employees, emplayeePackages и employeeSalaryCredits

case class Employee(id: String, name: String) 

case class EmployeePackage(id: String, employeeId: String, baseSalary: Double) 

case class EmployeeSalaryCredit(id: String, employeeId: String, salaryCredited: Double, date: ZonedDateTime) 

Теперь предположим, вы хотите, чтобы все кредиты зарплаты для всех сотрудников с employee's id, employee's name, base salary, actual credited salary and date of salary credit тогда ваш запрос будет выглядеть

val queryExample = employees 
    .join(employeePackages) 
    .on({ case (e, ep) => e.id === ep.employeeId }) 
    .join(employeeSalaryCredits) 
    .on({ case ((e, ep), esc) => e.id === esc.employeeId }) 
    .map({ case ((e, ep), esc) => 
    (e.id, e.name, ep.baseSalary, esc.salaryCredited, esc.date) 
    }) 
Смежные вопросы