SELECT b.*,
a.jeopCodeId,
a.JeopCodeDetail
FROM storm_jeopinfo a,
storm_orders b
WHERE a.ordernumber IS NOT NULL
AND a.ordernumber = b.order_number
AND b.Installed_dt IS NOT NULL
AND b.CUST_SIGN_DT BETWEEN CONVERT(date, '2012-06-01', 102)
AND CONVERT(date, '2013-04-30', 102)
UNION ALL
SELECT b.*,
a.jeop_code,
a.jeop_desc
FROM storm_bpm_jeops a,
storm_orders b
WHERE b.order_number = a.Order_number
AND b.srvc_order_unit = a.srvc_order_unit
错误消息:转换varchar值时转换失败 'JEOP-008'到数据类型int。
它继续与下一列的系列。无法成功执行此查询。
答案 0 :(得分:1)
根据您的更新,您可能需要
CAST(SUBSTRING(a.jeop_code,6,3)as int)as jeopCodeId
或者你可能想要一个如下的联接。
但是,除非您告诉我们您想要做什么以及该表的业务规则,否则我无法确定。
SELECT b.*,
a.jeopCodeId,
a.JeopCodeDetail,
a2.jeop_code,
a2.jeop_desc
FROM storm_orders b
join storm_jeepinfo a on a.ordernumber = b.order_number
join storm_bpm_jeops a2 on a2.order_number = b.order_number
and a2.srvc_order_unit = b.srvc_order_unit
WHERE a.ordernumber IS NOT NULL -- is b.ordernumber ever null if no then this can go.
AND b.Installed_dt IS NOT NULL
AND b.CUST_SIGN_DT BETWEEN CONVERT(date, '2012-06-01', 102)
AND CONVERT(date, '2013-04-30', 102)
问题:为什么storm_jeepinfo.ordernumber没有_
?如果你的命名一致,可能会更好。这是最明显的新手错误。
错误的命名没有任何好处!
看起来你有一些错别字。请记住,在UNION中所有选择字段必须完全匹配...例如,在第一个选择中,您选择a.jeopCodeId
,但在第二个选择中,您不需要输入ID并选择a.jeop_code
- 它们显然是不兼容的数据类型。
我注意到A在两个select语句中都没有引用同一个表。某些字段可能不具备兼容类型。在这种情况下,您可以选择空字符串''
或0
甚至是null
,以查找您尝试合并的字段。
答案 1 :(得分:0)
SELECT b.*,
cast (a.jeopCodeId as varchar (50)),
a.JeopCodeDetail
FROM storm_jeopinfo a
JOIN storm_orders b
ON a.ordernumber = b.order_number
WHERE a.ordernumber IS NOT NULL
AND b.Installed_dt IS NOT NULL
AND b.CUST_SIGN_DT BETWEEN CONVERT(date, '2012-06-01', 102)
AND CONVERT(date, '2013-04-30', 102)
UNION ALL
SELECT b.*,
a.jeop_code,
a.jeop_desc
FROM storm_bpm_jeops a
JOIN storm_orders b
ON b.order_number = a.Order_number
AND b.srvc_order_unit = a.srvc_order_unit
请注意,我修复了不应该使用的隐式连接,因为它们在很多年前被更好的语法(更容易维护并且不太可能发生意外交叉连接)所取代。此外,Select *是一种非常差的技术,应该用字段列表替换。当你有一个联合时尤其如此,因为如果一个表改变而另一个表改变,它将会中断。此外,浪费网络和数据库资源来调用比您打算使用的列更多的列。