我有这个嵌套的SQL语句:
SELECT
SalesOrderID,
LineTotal,
(SELECT AVG(LineTotal)
FROM Sales.SalesOrderDetail) AS AverageLineTotal,
LineTotal - (SELECT AVG(LineTotal)
FROM Sales.SalesOrderDetail) AS Variance
FROM
Sales.SalesOrderDetail
Sales.SalesOrderDetail
指的是什么?这张表怎么样?
是否有Sales
表?
LineTotal - (SELECT AVG(LineTotal)
FROM Sales.SalesOrderDetail) AS Variance
周围需要括号或不需要括号:
(LineTotal - (SELECT AVG(LineTotal)
FROM Sales.SalesOrderDetail)) AS Variance
答案 0 :(得分:3)
“。”用于分隔不同的元素。
SQL Server中的表名最多包含4个元素:
在您的情况下,您有2个元素 - 架构名称和表名。
模式类似于(一级)文件夹,用于对相应的元素(表,视图,所有内容)进行分组。如果你有一个非平凡的数据库(数百个表),一些组织是好的。例如,此组织还允许您设置架构级别的权限。
您可以在https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql
的文档中阅读有关schemata的更多信息答案 1 :(得分:0)
SalesOrderDetail是表名,Sales是模式名称(在其下创建SalesOrderDetail)。
销售是架构名称。
LineTotal - (SELECT AVG(LineTotal) 来自Sales.SalesOrderDetail)AS Variance 将使用括号或不使用括号。两者都会给出相同的结果。
答案 2 :(得分:0)
销售是一种架构,就像dbo一样。
我将Sales.SalesOrderDetail更改为@Sales_SalesOrderDetail只是为了让您更容易理解查询。
下面的子查询将计算LineTotal的平均值
SELECT AVG(LineTotal)FROM @Sales_SalesOrderDetail)
declare @Sales_SalesOrderDetail table (SalesOrderID int identity , LineTotal int)
insert @Sales_SalesOrderDetail(LineTotal) select 10
insert @Sales_SalesOrderDetail(LineTotal) select 20
insert @Sales_SalesOrderDetail(LineTotal) select 30
insert @Sales_SalesOrderDetail(LineTotal) select 40
SELECT SalesOrderID,
LineTotal,
(SELECT AVG(LineTotal)
FROM @Sales_SalesOrderDetail) AS AverageLineTotal,
LineTotal - (SELECT AVG(LineTotal)
FROM @Sales_SalesOrderDetail) AS Variance
FROM @Sales_SalesOrderDetail
此代码的替代版本是:
declare @Sales_SalesOrderDetail table (SalesOrderID int identity , LineTotal int)
insert @Sales_SalesOrderDetail(LineTotal) select 10
insert @Sales_SalesOrderDetail(LineTotal) select 20
insert @Sales_SalesOrderDetail(LineTotal) select 30
insert @Sales_SalesOrderDetail(LineTotal) select 40
DECLARE @AverageLineTotal int = (SELECT AVG(LineTotal) FROM @Sales_SalesOrderDetail)
SELECT SalesOrderID,
LineTotal,
@AverageLineTotal,
LineTotal - @AverageLineTotal AS Variance
FROM @Sales_SalesOrderDetail
结果相同,但性能更好,因为AVG只计算一次而不是每一行。