简单的PostgreSQL查询到Slick查询的麻烦转换

时间:2016-10-04 12:32:15

标签: postgresql scala slick

我有一个简单的PostgreSQL查询,我无法转换为光滑的查询。使用groupBy子句时,我会陷入语法汤中。

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

我知道我已经在一个大查询中创建基本查询并分别对它们应用连接。有人可以帮我指导或给我一些例子吗?光滑很难。

1 个答案:

答案 0 :(得分: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)
  })