我正在尝试在两个不同表中的两个不同命名的列上创建UNION ALL查询。
我想取表USER_EXCEL中的“MTRL”列,并将其与IM_EXCEL表中的“short_material_number”列进行比较。然后我希望查询只返回两列之间的差异。两列都包含材料编号,但在表格中以不同的方式命名(列方式)。
到目前为止我所拥有的是:
(SELECT [MTRL] FROM dbo.USER_EXCEL
EXCEPT
SELECT [short_material_number] FROM dbo.IM_Excel)
UNION ALL
(SELECT [short_material_number] FROM dbo.IM_Excel
EXCEPT
SELECT [MTRL] FROM dbo.USER_EXCEL)
但是,在尝试运行该查询时,我收到一条错误消息,指出:
Msg 8114,Level 16,State 5,Line 22
将数据类型varchar转换为float时出错。
答案 0 :(得分:0)
您几乎肯定会收到此错误,因为您的两列之一是FLOAT
数据类型,而另一列是VARCHAR
。 This article是开始阅读隐式转换的好地方,当您尝试比较两个不同数据类型的列时会发生隐式转换。
要使其正常工作,您需要将float转换为varchar,如下例所示。
(
SELECT [MTRL] FROM dbo.USER_EXCEL
EXCEPT
SELECT CAST([short_material_number] AS VARCHAR(18)) FROM dbo.IM_Excel
)
UNION ALL
(
SELECT CAST([short_material_number] AS VARCHAR(18)) FROM dbo.IM_Excel
EXCEPT
SELECT [MTRL] FROM dbo.USER_EXCEL
)
答案 1 :(得分:0)
从您的问题我明白您正在尝试比较两列但只返回一列我建议您使用以下查询来并排比较差异
SELECT ue.[MTRL], ie.[short_material_number]
FROM dbo.IM_Excel ie
FULL OUTER JOIN
dbo.USER_EXCEL ue
ON CAST(ie.[short_material_number] AS VARCHAR(20)) = ue.[MTRL]
WHERE ie.[short_material_number] IS NULL
OR ue.[MTRL] IS NULL