sql - 如何正确查询数据库以获取包含列表的结果

标签 sql database postgresql

假设我有一个包含以下内容的数据库:

orders(id, total, address_id)
line_items(id, product_id, order_id, quantity, price)
products(id, name, price)
addresses(id, address)

我需要提供包含以下内容的报告:

Order #123
Line Items
  3 x Product 1 @ $3 = $9
  2 x Product 2 @ 1 = $2
Total: $11
Shipping: 123 Main Street

Order #124
Line Items
  1 x Product 1 @ $3 = $3
  1 x Product 2 @ 1 = $1
Total: $4
Shipping: 456 Jones Ave

因此,需要显示订单列表,对于每个订单,需要显示 id、订单项列表、订单总计和送货地址。

在不查询每个订单以获取订单项和运输信息的情况下,执行此操作的最佳方法是什么?

我是否应该有一个包含以下内容的 View :

order_id, line_item_quantity, line_item_price, product_name, line_item_total, shipping_address

然后在应用代码中按订单id分组?这是我能想到的最好的办法,但它看起来很草率(当然,在现实世界中,每个表中会有更多的信息,而且还有更多的表)。

最佳答案

您需要将关系展平,并按订单 ID 排序:

select O.id, L.quantity, P.name, P.price, A.address,
L.quantity * P.price subtotal,
(
    select sum(L1.quantity * P1.price)
    from line_items L1
    inner join products P1 on L1.product_id = P1.id
    where L1.order_id = O.id
) ordertotal
from orders O
inner join line_items L on O.id = L.order_id
inner join products P on L.product_id = P.id
inner join addresses A on O.address_id = A.id
order by O.id, L.id

然后根据您构建报告的方式,尝试在遍历生成的行时检测订单 ID 的变化。当订单ID发生变化时,就需要建立一套新的订单。

例如,如果你使用 Crystal 报表,你只需要在订单ID上设置一个新的分组,它就会自动对订单进行分割。

关于sql - 如何正确查询数据库以获取包含列表的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8768716/

相关文章:

mysql - LPAD/RPAD : Align column

android - 在将其保存到数据库之前如何比较以前的值与当前值?

postgresql - postgres 和 IPv6 地址的大列表

postgresql - pg_dumpall - Azure Database for PostgreSQL - 数据库 "azure_maintenance"的权限被拒绝

javascript - 如何在Sequelize中按多对多关系排序?

sql - 使用 Postgresql 将来自多个 csv 文件的大量数据插入到不同的表中

mysql - 数据库性能检查表

python - Redshift 将值插入表中

php - 将 csv 导入到 mysql 数据库表期间找不到文件

mysql - 数据库设计一张表或两张表