差异查询但结果相同

时间:2018-08-25 14:30:20

标签: sql sql-server

我的查询必须返回: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

2 个答案:

答案 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。 然后您的第一个查询就可以了。