我有两张表格如下:
Table 1 "customer" with fields "Cust_id", "first_name", "last_name" (10 customers)
Table 2 "cust_order" with fields "order_id", "cust_id", (26 orders)
我需要显示"Cust_id" "first_name" "last_name" "order_id"
我需要按order_id
组计算cust_id
个列表,列出每个客户下达的订单总数。
我在查询下运行,但是,它计算所有26个订单并将26个订单应用于每个客户。
SELECT COUNT(order_id), cus.cust_id, cus.first_name, cus.last_name
FROM cust_order, customer cus
GROUP BY cust_id;
您能否建议/建议查询中有什么问题?
答案 0 :(得分:2)
你在这里发出的问题是,你告诉数据库这两个表是如何“连接”的,或者它们应该连接的是什么:
看一下这张图片:
这有效地允许您将两个表“连接”在一起,并在它们之间使用查询。
所以你可能想要使用类似的东西:
SELECT COUNT(B.order_id), A.cust_id, A.first_name, A.last_name
FROM customer A
LEFT JOIN cust_order B //this is using a left join, but an inner may be appropriate also
ON (A.cust_id= B.Cust_id) //what links them together
GROUP BY A.cust_id; // the group by clause
根据您的评论请求更多信息:
左连接(右连接几乎相同,只是相反):
SQL LEFT JOIN返回左表中的所有行,即使右表中没有匹配项也是如此。这意味着如果ON子句匹配右表中的0(零)记录,则连接仍将在结果中返回一行,但在右表的每列中都返回NULL。〜Tutorials Point。< / p>
这意味着左连接返回左表中的所有值,右表中的加匹配值,如果没有匹配的连接谓词,则返回NULL。
LEFT联接将用于您希望从左侧表格中检索所有数据的情况,以及仅从右侧匹配的数据。
执行时间
虽然在这种情况下接受的答案可能适用于小型数据集,但在较大的数据库中可能会变得“沉重”。这是因为这种操作不是实际设计。
这是 加入 的目的。
数据库系统中的大量工作旨在有效实现连接,因为关系系统通常需要连接,但在优化其高效执行方面却面临困难。问题出现是因为内连接既可以交换也可以相关联地运行。〜Wikipedia
实际上,这意味着用户仅提供用于加入的表列表和要使用的连接条件,并且数据库系统的任务是确定执行操作的最有效方式。查询优化器确定如何执行包含联接的查询。因此,通过允许dbms 选择 查询数据的方式,您可以节省大量时间。
其他加入/摘要
>=2
表的其他方式快得多(在较大的数据集上可以看到速度更快)。答案 1 :(得分:1)
也许左连接会帮助你
SELECT COUNT(order_id), cus.cust_id, cus.first_name, cus.last_name ]
FROM customer cus
LEFT JOIN cust_order co
ON (co.cust_id= cus.Cust_id )
GROUP BY cus.cust_id;
答案 2 :(得分:1)
你可以尝试这个:
SELECT COUNT(cus_order.order_id), cus.cust_id, cus.first_name, cus.last_name
FROM cust_order cus_order, customer cus
WHERE cus_order.cust_id = cus.cust_id
GROUP BY cust_id;