【问题标题】:Scope of range variables in SQL ServerSQL Server 中范围变量的范围
【发布时间】:2016-11-20 03:38:56
【问题描述】:

考虑以下语句:

SELECT a.* 
FROM tblA a 
WHERE a.Name = @Name 

UNION 

(SELECT a.* 
 FROM tblB 
 WHERE a.Name = @Name)

请注意,两个不同表的范围变量(又名别名)已被赋予相同的名称。

这样做有没有潜在的冲突或歧义?是否应在语句中为所有范围变量(别名)赋予唯一名称,例如:

SELECT a.* 
FROM tblA a 
WHERE a.Name = @Name 

UNION 

(SELECT b.* 
 FROM tblB 
 WHERE b.Name = @Name)

经验表明,到目前为止,这已经奏效......每个范围变量(别名)的范围似乎并未跨越 UNION,但这取决于不受支持的行为,还是范围变量(别名)有与此类案例相关的正式定义范围?

【问题讨论】:

  • 如果第一个查询有效,我很惊讶。虽然如果它可以工作,但相同的操作系统只有第一个选择而没有联合。
  • 这还能用吗
  • 这两个查询甚至都不会执行
  • @JorgeCampos 我已经验证它有效。因为我实际上没有两个具有相同结构的表,所以我没有使用SELECT a.*,而是使用了SELECT a.SiteID FROM tblA a UNION SELECT a.SiteID FROM tblB a。它返回了预期的行数。
  • @H.Fadlallah sql 和 tsql 标签可能就足够了。 (如果我们添加太多标签,每个标签对搜索的用处就会降低。)

标签: sql sql-server tsql variables scope


【解决方案1】:

你把“范围变量”这个词扔给了我。我一直看到这种结构称为“别名”。

我不是 SQL 标准方面的专家,但我无法理解数据库引擎在重复使用表别名时会遇到问题的解释。 UNION 之前和之后的每个 SELECT 语句就是这样 - 一个功能齐全、完整的 SELECT 语句。这两个陈述彼此完全独立——彼此都不知道对方的任何事情。无法将第一个查询中的一行与第二个查询中的一行相关联,所以我看不出别名如何相互干扰。

您已经证明它可以在 SQL Server 上运行。

我在SQL Fiddle 上尝试过,它适用于 MySQL、PostgreSQL 和 SQLite。不幸的是,小提琴站点上的 Oracle 和 MS SQL Server 已损坏,因此无法在那里进行测试。

【讨论】:

  • 这里是rextester.com (Microsoft SQL Server 2014)。它有效。
  • 很抱歉给您带来了困惑。我在与不同的数据库产品相关的情况下学习了该术语。
猜你喜欢
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
相关资源
最近更新 更多