考虑以下语句:
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,但这是否取决于不支持的行为,或者范围变量(别名)是否具有与此类案例相关的正式定义范围?
最佳答案
你向我抛出了“范围变量”这个术语。我总是看到称为“别名”的构造。
我不是 SQL 标准方面的专家,但我无法理解数据库引擎在重复使用表别名时会出现问题的解释。 UNION 之前和之后的每个 SELECT 语句就是一个功能齐全、完整的 SELECT 语句。这两个陈述完全相互独立——双方都不了解对方的任何情况。无法将第一个查询中的行与第二个查询中的行关联起来,因此我不知道别名如何相互干扰。
您已经证明它可以在 SQL Server 上运行。
我在 SQL Fiddle 上试过了,并且它适用于 MySQL、PostgreSQL 和 SQLite。不幸的是,Oracle 和 MS SQL Server 在 fiddle 站点上已损坏,因此无法在那里进行测试。
关于sql - SQL Server 中范围变量的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40700433/