拆分独立表的查询或多个连接

时间:2017-12-14 01:09:14

标签: sql postgresql join

我已经为此寻找了几个小时,但我无法找到合适的解决方案。我将从虚构的表格开始说出我期待的结果。解析sql查询后,我想返回这样的内容:

[
  {
    "storeID": 1,
    "storeName": "best store ever",
    "products": [
      {
        "productID": 1,
        "productName": "Name1",
        "productPrice": 10.00
      },
      {
        "productID": 2,
        "productName": "Name2",
        "productPrice": 10.00
      },
      {
        "productID": 3,
        "productName": "Name3",
        "productPrice": 10.00
      },
      ...
    ],
    "employees": [
      {
        "employeeID": 1,
        "employeeName": "Name1",
        "employeeSalary": 40000.00
      },
      {
        "employeeID": 2,
        "employeeName": "Name1",
        "employeeSalary": 45000.00
      },
      ...
    ]
  },
  ...
]

我的问题是将stores表与products和employees表连接起来。现在我正在这样做:

SELECT
  s.storeID,
  s.storeName,
  p.productID,
  p.productName,
  p.productPrice,
  e.employeeID,
  e.employeeName,
  e.employeeSalary,
FROM stores AS s
LEFT JOIN products AS p ON p.fk_store_id = s.storeID
LEFT JOIN employees AS e ON e.fk_store_id = s.storeID;

有了这个,我得到的产品x员工每个商店的行数,这是一个重大的开销。如果我可以获得产品+员工的行数,那就没问题了。但这似乎与做两个单独的查询相同......一个用于加入产品的商店,另一个用于加入员工的商店。

对此更合适的解决方案是什么?

2 个答案:

答案 0 :(得分:2)

您在此尝试的联接类型不适合LEFT加入。在3个表之间进行连接时:A,B和C;表A和B首先连接,然后与此连接的结果连接,表C将连接。因此,如果表B和C都具有连接到表A的所有行的数据,那么行的总数将是n(A)* n(B)* n(C)。

对于您的愿望输出,您需要有两个查询。或者,您可以进行一次查询,然后使用前端脚本将结果转换为您想要的输出。

答案 1 :(得分:0)

这就是我使用UNION的意思。将需要一些操作来查看类型列并找出如何在下一层处理它。

SELECT
  s.storeID,
  s.storeName,
  'Employee' AS type,
  e.employeeID AS id,
  e.employeeName AS name,
  e.employeeSalary AS cost
FROM stores AS s
LEFT JOIN employees AS e ON e.fk_store_id = s.storeID
UNION
SELECT
  s.storeID,
  s.storeName,
  'Product' AS type,
  p.productID,
  p.productName,
  p.productPrice
FROM stores AS s
LEFT JOIN products AS p ON p.fk_store_id = s.storeID;

使用联接的单一查询是不可能的,因为产品和员工之间没有直接关系,因此您将加入商店,这将为您提供产品X员工加入。