首页 > 解决方案 > 如何合并两个具有一对多关系的表

问题描述

我有两张主要订单和订购产品的表格。

Table 1: ORDERS
"CREATE TABLE IF NOT EXISTS ORDERS("
                       "id_order INTEGER PRIMARY KEY AUTOINCREMENT,
                       "o_date TEXT,"
                       "o_seller TEXT,"
                       "o_buyer TEXT,"
                       "o_shipping INTEGER,"
                       "d_amount INTEGER,"
                       "d_comm INTEGER,"
                       "d_netAmount INTEGER)"
Table 2: ORDERED_PRODUCTS
"CREATE TABLE IF NOT EXISTS dispatch_products("
                       "id_order INTEGER NOT NULL REFERENCES ORDERS(id_order),"
                       "product_name INTEGER,"
                       "quantity INTEGER,"
                       "rate INTEGER)"

我尝试使用以下查询加入这两个表:

SELECT *
FROM ORDERS a
INNER JOIN ORDERED_PRODUCTS b
ON a.id_order = b.id_order
WHERE a.buyer = 'abc'

问题在于表 2 中包含多个产品的条目。我得到的输出如下所示:

order_ID date seller buyer Ship   amt  comm nAmt Prod  Qty Rate
1             A      x       5    100  5    115  Scale 10  10
2             B      abc     10   100  5    115  pen    5  10
2             B      abc     10   100  5    115  paper 10   5
3             C      xyz     10   100  5    220  book   5  20
3             C      xyz     10   100  5    220  stapl 10  10

expected output:
order_ID date seller buyer Ship   amt  comm nAmt Prod  Qty Rate
1             A      x       5    100  5    115  Scale 10  10
2             B      abc     10   100  5    115  pen    5  10
                                                 Paper 10   5
3             C      xyz     10   100  5    220  Book   5  20
                                                 Stapl 10  10

标签: sqlsqlite

解决方案


数据库并不是这样工作的。你得到了你想要的,并且没有重复(所有行都不同)。您正在查看来自订单的数据列并说“哦,数据是重复的”但事实并非如此 - 它是“在上下文中”加入的

想象一下,我只给了您预期输出中的一个示例行:

                                             Paper 10   5

保证我只是复制粘贴。

它来自什么命令?

不知道..你已经失去了上下文,所以它可能来自任何顺序。行是单独的实体,它们独立且不参考任何其他行,作为一组数据。这就是为什么每行都需要显示相同的订单信息。可以制作一个数据库来产生您所要求的预期输出,但在像 sqlite 这样的低端数据库中,它会非常复杂。对我来说更重要的是指出为什么你认为查询会给你的东西和它给你的东西之间存在差异,因为我认为这是真正的问题:查询给了你它应该给你的东西,没有错它; 这更像是对你会得到什么的错误假设

如果您尝试准备使用订单作为某种标题的报告,请在前端应用程序中单独选择它们。选择所有订单,然后逐个(按订单)拉出所有项目详细信息,随时构建报告:

myorders = dbquery("SELECT * FROM ORDERS")
for each(order o in myorders)
  print(o.header)
  details = dbquery("SELECT * FROM dispatch_products where id_order = ?", o.id)
  for each(detail d in details)
    print(d.prod, d.qty, d.rate)

推荐阅读