请考虑以下声明:
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,但这取决于不支持的行为,或者范围变量(别名)是否具有正式定义与此类案件相关的范围?
答案 0 :(得分:3)
你向我扔了“范围变量”一词。我一直认为这个结构叫做“别名”。
我不是SQL标准方面的专家,但我无法理解数据库引擎在重用表别名时遇到问题的解释。 UNION之前和之后的每个SELECT语句就是一个 - 一个功能完备的完整SELECT语句。这两个陈述完全相互独立 - 对另一方都不了解。无法将第一个查询中的行与第二个查询中的行相关联,因此我看不到别名如何相互干扰。
您已经证明它适用于SQL Server。
我在SQL Fiddle上尝试过,它适用于MySQL,PostgreSQL和SQLite。不幸的是,Oracle和MS SQL Server在小提琴网站上被打破了,所以无法在那里进行测试。