2016-10-04 62 views
0

我有一个普通的PostgreSQL查询,我无法翻译成漂亮的查询。当使用groupBy条款时,我会陷入语法汤。将普通PostgreSQL查询的麻烦转换为平滑查询

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。您可以使用现有的sql,并使用光滑的方式将其映射到结果类型。 –

回答

0

看起来很简单写。我不打算帮你写出整个查询,我只是给你一个例子,你可以按照你的查询。

比方说,你有以下结构和相应的表查询定义为employeesemplayeePackagesemployeeSalaryCredits

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) 
    })