MS SQL:如何在查询执行中评估变量和别名?
MS SQL: How are variables and aliases evaluated within query execution?
我正在做一个 MS SQL 项目,总体来说 SQL 是个新手。
在包含以下内容的查询中:
SELECT DISTINCT u.sUserType
FROM @users u
并且别名(变量'u')在声明变量之前被使用(@param 之前已经声明)。再说一遍:
SELECT
...,
aType.hMy as hAssetType,
...,
...,
...,
...,
etc
FROM @users u
LEFT JOIN somTableName aType on UPPER(u.sAssetType) UPPER(aType.sType)
LEFT JOIN etc
LEFT JOIN etc
我的背景非常Javascript,其中有'hoisting'的概念。
问:
是否可以从编译或解释的角度讨论 SQL 查询?
问:
在使用后定义变量的查询执行是否与 Javascript 提升相当?
问:
此外,这与 SQL 标准的其他实现相比如何?
----- 编辑 -----
下面的回答指出别名与变量不同。
变量需要先声明才能被引用,但是
当然,在执行开始之前,SQL 引擎会解释查询并选择整个查询的执行计划。
您将别名与变量混为一谈。在 SQL 中,变量必须在使用前声明。可以在 SQL 查询中引用别名 "higher up",并定义 "further down",但我怀疑它是否与 "hoisting" 相当,不管它是什么,因为 JavaScript 是一个逐行的事情,SQL 查询被解释为单个基于集合的操作。
你的意思是这在不同的 RDBMS 之间有何不同?一点也不多,从我合作过的几个。
我正在做一个 MS SQL 项目,总体来说 SQL 是个新手。
在包含以下内容的查询中:
SELECT DISTINCT u.sUserType
FROM @users u
并且别名(变量'u')在声明变量之前被使用(@param 之前已经声明)。再说一遍:
SELECT
...,
aType.hMy as hAssetType,
...,
...,
...,
...,
etc
FROM @users u
LEFT JOIN somTableName aType on UPPER(u.sAssetType) UPPER(aType.sType)
LEFT JOIN etc
LEFT JOIN etc
我的背景非常Javascript,其中有'hoisting'的概念。
问: 是否可以从编译或解释的角度讨论 SQL 查询?
问: 在使用后定义变量的查询执行是否与 Javascript 提升相当?
问: 此外,这与 SQL 标准的其他实现相比如何?
----- 编辑 -----
下面的回答指出别名与变量不同。
变量需要先声明才能被引用,但是
当然,在执行开始之前,SQL 引擎会解释查询并选择整个查询的执行计划。
您将别名与变量混为一谈。在 SQL 中,变量必须在使用前声明。可以在 SQL 查询中引用别名 "higher up",并定义 "further down",但我怀疑它是否与 "hoisting" 相当,不管它是什么,因为 JavaScript 是一个逐行的事情,SQL 查询被解释为单个基于集合的操作。
你的意思是这在不同的 RDBMS 之间有何不同?一点也不多,从我合作过的几个。