SQL Server:UNION ALL与字面量结合出现异常结果的问题排查
问题分析:为什么Union All结果里没有标记为'B'的行?
哈哈,这个小疏忽我一眼就看出来啦!你原本期望通过UNION ALL分别给@tblA和@tblB的数据打上'A'和'B'的标记,但执行后所有行的SourceFlag全是'A',完全看不到'B'的影子。
先看你的简化测试代码:
DECLARE @tblA TABLE(Id INT,SomeValue VARCHAR(100)); INSERT INTO @tblA VALUES (1,'blah'); DECLARE @tblB TABLE(Id INT,SomeValue VARCHAR(100)); INSERT INTO @tblA VALUES (2,'blub'); -- 这里就是核心错误! SELECT 'A' AS SourceFlag, Id, SomeValue FROM @tblA UNION ALL SELECT 'B', Id, SomeValue FROM @tblB
执行后返回的结果:
SourceFlag Id SomeValue A 1 blah A 2 blub
你提到执行计划里确实生成了对应'A'和'B'的计算标量,也有Concatenation操作,但结果里就是没有'B'的行?
原因超级简单——你把本该插入@tblB的数据插到@tblA里了!看代码第四行的INSERT INTO @tblA VALUES (2,'blub');,这里应该写成INSERT INTO @tblB才对。因为这个疏忽,@tblB里根本没有任何数据,所以SELECT 'B', Id, SomeValue FROM @tblB这部分查询没有返回任何行,最终结果自然只有@tblA的两行,全部标记为'A'。
把INSERT语句改成INSERT INTO @tblB VALUES (2,'blub');再执行,就能得到你预期的结果:一行标记'A',一行标记'B'啦。
内容的提问来源于stack exchange,提问作者Gottfried Lesigang
相关产品推荐
相关产品推荐

