我的查询必须返回:ID订单,该订单中的商品数量,仅显示前一个。
我第二次自己做的第一个查询来自提示。两者都给了我相同的结果。
所以我的问题是:我的解决方案对该查询有问题,或者只是显示iam初学者如何做得这么糟糕。
想法是,我不明白为什么我只能从一个表中调用才能加入该查询中的两个表
处理数据库'adventureWorks2012'
我的查询:
Select Top 1
SalesOrderID,
COUNT(*) as Items
From
Sales.SalesOrderDetail
Group By
SalesOrderID
Order BY
Items DESC
解决方案:
Select Top 1
H.SalesOrderID,
Count(*) as AmountItems
From
Sales.SalesOrderHeader As H JOIN SAles.SalesOrderDetail As D
ON H.SalesOrderID = D.SalesOrderID
Group by
H.SalesOrderID
Order BY
COUNT(*) DESC
答案 0 :(得分:1)
您的查询很好。实际上,假设SalesOrderID
的所有值都在SalesOrderHeader
中,这比其他查询要好。这是一个非常合理的假设(如果已定义外键约束,则可以保证。)
您还为ORDER BY
使用了别名。那是另一个优点。
我认为您的查询更简单,更快,并且显示了对SQL的合理了解。
答案 1 :(得分:1)
如果SalesOrderDetail.SalesOrderID是SalesOrderHeader.SalesOrderID的外键,那么将确保引用完整性。因此,在这种情况下,无需加入SalesOrderHeader即可完成。然后只对SalesOrderDetail.SalesOrderID
进行分组SELECT TOP 1
d.SalesOrderID,
COUNT(*) as AmountItems
FROM Sales.SalesOrderDetail d
GROUP BY d.SalesOrderID
ORDER BY COUNT(*) DESC;
但是,如果SalesOrderDetail.SalesOrderID不是外键?而且您只想计算SalesOrderHeader中实际存在的SalesOrderID?然后加入SalesOrderHeader可以确保这一点。
SELECT TOP 1
d.SalesOrderID,
COUNT(*) as AmountItems
FROM Sales.SalesOrderDetail d
JOIN SalesOrderHeader h ON h.SalesOrderID = d.SalesOrderID
GROUP BY d.SalesOrderID
ORDER BY COUNT(*) DESC;
因此,假设SalesOrderID是SalesOrderHeader的主键。 It is。 并且SalesOrderDetail.SalesOrderID是SalesOrderHeader.SalesOrderID的外键。 It is。 然后您的第一个查询就可以了。