2014-10-17 179 views
0

我正在尝试在两个不同表中的两个不同名称的列上创建一个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) 

但是,试图运行该查询我收到一条错误消息时:

消息8114,级别16,状态5,行22
将数据类型varchar转换为float时出错。

+1

我的猜测是,一个的列包含数字值和其他文本。查询是隐式尝试将文本转换为数值,其中一个记录包含无法转换的文本值。 – Barry 2014-10-17 18:42:30

+0

@巴里是啊,就是这样。当然。 – 2014-10-17 18:47:31

+1

请添加“MTRL”和“short_material_number”的数据类型 – Ram 2014-10-17 18:50:53

回答

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 
) 
+0

这应该修复隐式转换错误。 – Barry 2014-10-17 18:47:16

+0

谢谢大家..我是新来的SQL查询,所以仍然在学习。再次感谢你。 – user3896424 2014-10-17 18:53:21

+0

乐意帮忙!如果这个或任何答案已解决您的问题,请点击复选标记考虑[接受它](http://meta.stackexchange.com/q/5234/179419)。这向更广泛的社区表明,您已经找到了解决方案,并为答复者和您自己提供了一些声誉。没有义务这样做。 – AHiggins 2014-10-17 18:55:03

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 
相关问题