我们说我有表companies
和employees
,其中后者有company_id
字段引用前者。我想了解一家拥有特定身份证的公司和在那里工作的人的一切。我看到两种方法可以做到这一点,但两者都有问题。
我可以通过连接一次性获取所有数据:
SELECT *
FROM companies, employees
WHERE <id> = companies.id
AND <id> = employees.company_id
但是companies
表中单行的所有数据都会在结果的每一行中重复出现(即公司的每位员工都会重复一次)。可以想象,客户可以应用某种压缩或巧妙分析来减少传输数据的数量,但我不知道这是实际完成的还是有效的。
我可以使用两个查询:
SELECT *
FROM companies
WHERE <id> = companies.id
SELECT *
FROM employees
WHERE <id> = employees.company_id
但是不得不两次前往数据库会增加延迟。
有没有解决这些低效问题的方法?我正在使用PostgreSQL,Slick(Scala)和Play。 JDBC是否避免重复数据?
答案 0 :(得分:1)
执行此操作的最简单方法可能是将所有员工数据聚合到一个数组或json值中,该值将附加到公司的列中。对于jsonb
:
SELECT c.*, e.employee_data
FROM companies c
JOIN (
SELECT company_id, jsonb_agg(to_jsonb(employees)) AS employee_data
FROM employees
GROUP BY company_id) e ON e.company_id = c.id
WHERE <id> = companies.id;