如何为UNION ALL中的EM_Main、OP_Main表添加同类型EBDP列
处理UNION ALL关联多表的列匹配问题
要通过UNION ALL关联SP_Main、EM_Main和OP_Main三张表,其中SP_Main需通过计算生成EBDP列;但EM_Main和OP_Main无对应列,必须为这两张表补充与EBDP同数据类型的列,才能保证UNION ALL正常执行。
原始代码如下:
SELECT ISNULL(CONVERT(money,[COLUMN1]), 0.00) * COALESCE(CONVERT(MONEY,[COLUMN2]),CONVERT(MONEY,[COLUMN3]), 1.00) AS [EBDP], ISNULL(CONVERT(money,[COLUMN1]), 0.00) * COALESCE(CONVERT(MONEY,[COLUMN2]),CONVERT(MONEY,[COLUMN3]), 1.00) + [ActivityPrice] AS TotalPrice, convert(money,[COLUMN4]) AS ActivityPrice FROM [SP_Main] e UNION ALL SELECT [COLUMN WILL NEED TO BE CREATED FOR HERE] ISNULL(CONVERT(money,[COLUMN5]), 0.00) AS [TotalPrice], ISNULL(CONVERT(money,[COLUMN6]), 0.00) AS [ActivityPrice] FROM EM_Main UNION ALL SELECT [COLUMN WILL NEED TO BE CREATED FOR HERE] ISNULL(CONVERT(money,[COLUMN5]), 0.00) AS [TotalPrice], ISNULL(CONVERT(money,[COLUMN6]), 0.00) AS [ActivityPrice] FROM OP_Main
修正后的代码
EBDP为money类型,给EM_Main和OP_Main的查询补充同类型的EBDP列(可根据业务需求设置默认值,这里以0.00为例),同时保证列顺序与第一个子查询完全一致:
SELECT ISNULL(CONVERT(money,[COLUMN1]), 0.00) * COALESCE(CONVERT(MONEY,[COLUMN2]),CONVERT(MONEY,[COLUMN3]), 1.00) AS [EBDP], ISNULL(CONVERT(money,[COLUMN1]), 0.00) * COALESCE(CONVERT(MONEY,[COLUMN2]),CONVERT(MONEY,[COLUMN3]), 1.00) + [ActivityPrice] AS TotalPrice, CONVERT(money,[COLUMN4]) AS ActivityPrice FROM [SP_Main] e UNION ALL SELECT CONVERT(money, 0.00) AS [EBDP], -- 补充同类型的EBDP列,默认值设为0.00 ISNULL(CONVERT(money,[COLUMN5]), 0.00) AS [TotalPrice], ISNULL(CONVERT(money,[COLUMN6]), 0.00) AS [ActivityPrice] FROM EM_Main UNION ALL SELECT CONVERT(money, 0.00) AS [EBDP], -- 同样补充EBDP列 ISNULL(CONVERT(money,[COLUMN5]), 0.00) AS [TotalPrice], ISNULL(CONVERT(money,[COLUMN6]), 0.00) AS [ActivityPrice] FROM OP_Main
关键说明
UNION ALL要求所有子查询的列数一致、对应列的数据类型兼容,用CONVERT(money, 0.00)明确指定类型,避免隐式转换引发的问题。- 如果业务逻辑中
EM_Main和OP_Main的EBDP应为空值,可改为CONVERT(money, NULL) AS [EBDP],确保数据类型匹配。
内容的提问来源于stack exchange,提问作者EAsh
相关产品推荐
相关产品推荐

