查询以比较两个不同表中两列的差异

时间:2014-10-17 18:36:10

标签: sql-server sql-server-2012 union

我正在尝试在两个不同表中的两个不同命名的列上创建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时出错。

2 个答案:

答案 0 :(得分:0)

您几乎肯定会收到此错误,因为您的两列之一是FLOAT数据类型,而另一列是VARCHARThis 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