Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 差异查询但结果相同_Sql_Sql Server - Fatal编程技术网

Sql 差异查询但结果相同

Sql 差异查询但结果相同,sql,sql-server,Sql,Sql Server,我的查询必须返回:ID顺序、该顺序中的项目数量、仅显示前一个 我自己做的第一个问题,第二个问题来自tips。两者都给了我同样的结果 所以我的问题是:我的解决方案是错误的,或者只是说明我是一个初学者,做了那么糟糕的事情 我的想法是,如果我只能从一个表调用,我不明白为什么我应该在该查询中连接两个表 数据库“adventureWorks2012”的工作 我的问题是: Select Top 1 SalesOrderID, COUNT(*) as Items From Sales.S

我的查询必须返回:ID顺序、该顺序中的项目数量、仅显示前一个

我自己做的第一个问题,第二个问题来自tips。两者都给了我同样的结果

所以我的问题是:我的解决方案是错误的,或者只是说明我是一个初学者,做了那么糟糕的事情

我的想法是,如果我只能从一个表调用,我不明白为什么我应该在该查询中连接两个表

数据库“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

你的问题很好。事实上,假设
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(*)可能更好