我有像
这样的伪SQL语句select [orderid], [productname], [price], [productid_FK]
from Order
这将给我5行:
结果是5行,其中3行的[productid_FK]为“2”。此FK列引用名为[Product]的表。
现在假设我想要一个基于[productid_FK]的额外列。
该列必须包含另一个名为[products]
的表中的产品总数我可以通过加入当前的伪查询来实现这个目的吗?
答案 0 :(得分:6)
获得结果的一种方法是子查询。根据数据库的不同,有几种方法可以做到这一点。我经常这样做
SELECT o.[orderid],
o.[productname],
o.[price],
[productid_FK],
p_counts.k
FROM order o
INNER JOIN (SELECT productid_fk,
COUNT(product_id) k
FROM products
GROUP BY productid_fk) p_counts
ON o.productid_fk = p_counts.productid_fk
答案 1 :(得分:4)
SELECT p.productid, p.productname, p.price, COUNT(o.orderid)
FROM Order AS o
JOIN Product AS p ON o.productid_FK = p.productid
GROUP BY p.productid, p.productname, p.price
答案 2 :(得分:3)
在MS SQL Server 2008中,您可以在聚合(计数,总和等)上使用OVER
子句。这将起作用(或至少,我为自己的表编写的版本工作:
SELECT [orderid], [productname], [price], [productid_FK]
,count(*) over (partition by [productid_FK])
from Order
我仍然觉得这样做可以做到这一点。据推测,其他RDBMS具有类似的功能。
答案 3 :(得分:0)
SELECT o.orderid, o.productname, o.price, o.productid_FK, COUNT(o.productid_FK)
FROM order o JOIN products p on o.productid_FK = p.productid
GROUP BY o.productname
应该从头开始。
您好像想知道订单中有多少产品属于您。也许你应该考虑一个稍微不同的架构设计。
[订单] 和 [产品] 相关 n:m ,这意味着:订单可以包含许多产品和产品可以是许多订单的一部分。所以我的建议是用第三个表来处理这种关系,例如 [OrderProducts] 包含字段 [orderid] 和 [productid] 。这样,您的 [订单] 和 [产品] 表格将只包含与其应有的唯一订单和产品。此外,您现在在每个相应产品的 [订单] 中都有一个数据集,因此订单的所有属性都会产生很大的开销。在关系表中,您还可以存储例如如果每个产品的价格偏离正常价格或类似价格,则每个产品的特价。