Sql 差异查询但结果相同
我的查询必须返回:ID顺序、该顺序中的项目数量、仅显示前一个 我自己做的第一个问题,第二个问题来自tips。两者都给了我同样的结果 所以我的问题是:我的解决方案是错误的,或者只是说明我是一个初学者,做了那么糟糕的事情 我的想法是,如果我只能从一个表调用,我不明白为什么我应该在该查询中连接两个表 数据库“adventureWorks2012”的工作 我的问题是:Sql 差异查询但结果相同,sql,sql-server,Sql,Sql Server,我的查询必须返回:ID顺序、该顺序中的项目数量、仅显示前一个 我自己做的第一个问题,第二个问题来自tips。两者都给了我同样的结果 所以我的问题是:我的解决方案是错误的,或者只是说明我是一个初学者,做了那么糟糕的事情 我的想法是,如果我只能从一个表调用,我不明白为什么我应该在该查询中连接两个表 数据库“adventureWorks2012”的工作 我的问题是: Select Top 1 SalesOrderID, COUNT(*) as Items From Sales.S
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
你的问题很好。事实上,假设
saleorderid
的所有值都在saleorderheader
中,它比其他查询更好。这是一个非常合理的假设(如果定义了外键约束,则可以保证)
您还为订购人使用了别名。这是另一个优点
我认为您的查询更简单、更快,并且显示了对SQL的合理了解。您的查询很好。事实上,假设
saleorderid
的所有值都在saleorderheader
中,它比其他查询更好。这是一个非常合理的假设(如果定义了外键约束,则可以保证)
您还为订购人使用了别名。这是另一个优点
我认为您的查询更简单、更快,并且显示了对SQL的合理了解。如果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的主键。
SalesOrderDetail.SalesOrderID是SalesOrderHeader.SalesOrderID.的外键。
然后您的第一个查询是a-ok。如果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的主键。
SalesOrderDetail.SalesOrderID是SalesOrderHeader.SalesOrderID.的外键。
那么您的第一个查询是a-ok。请确认与表SalesOrderHeader相关的列不是必需的。。您可以简单地使用单个表并避免连接。。。您必须只确保列ProductID不为null。。。使用count(*)更好,因为与表SalesOrderHeader相关的列不是必需的。。您可以简单地使用单个表并避免连接。。。您必须只确保列ProductID不为null。。。使用count(*)可能更好