我在哪里:
TABLE1.ITM_CD
是VARCHAR2数据类型TABLE2.ITM_CD
是NUMBER数据类型left join TABLE2 on TABLE1.ITM_CD = TABLE2.ITM_CD
会产生 ORA-01722:无效数字错误left join TABLE2 on to_number(TABLE1.ITM_CD) = TABLE2.ITM_CD
也会产生 ORA-01722:无效数字错误。TABLE1.ITM_CD
中的一个值是字符串" MIXED" left join TABLE2 on TABLE1.ITM_CD = to_char(TABLE2.ITM_CD)
成功运行,但它会为从TABLE2
中选择的字段返回空白值。以下是我的工作查询的简化版本:
select
A.ITM_CD
,B.COST
,B.SIZE
,B.DESCRIPTION
,A.HOLD_REASON
from
TABLE1 a
left join TABLE2 b on a.ITM_CD = to_char(b.ITM_CD)
此查询返回项目代码和保留原因的列表,但只是成本,大小和描述的空白值。我确认TABLE2
包含返回代码的这些字段的值。
更新:以下是包含其他信息的图片。
我从ALL_TAB_COLUMNS
中选择了以下信息 - 我不一定知道所有字段的含义,但认为它可能会有所帮助
答案 0 :(得分:1)
您可以在删除任何前导零后将TABLE1.ITM_CD
转换为数字并过滤掉“混合”值:
select A.ITM_CD
,B.COST
,B.SIZE
,B.DESCRIPTION
,A.HOLD_REASON
from ( SELECT * FROM TABLE1 WHERE ITM_CD <> 'MIXED' ) a
left join TABLE2 b
on TO_NUMBER( LTRIM( a.ITM_CD, '0' ) ) = b.ITM_CD
答案 1 :(得分:0)
这是一个SQL(实际上是数据库)问题,而不是PL / SQL。你需要解决这个问题 - 如果你不得不打击你的老板。项目代码必须是两个表中的一个中的主键,而另一个表中的外键必须是PK。或者也许Item代码是另一个你没有向我们展示的表中的PK,你向我们展示的两个表中的Item代码应该是FK指向那个PK。
你现在没有那种安排,这正是你遇到这些麻烦的原因。数据类型必须匹配(现在不是),并且你不应该有像'MIXED'这样的值 - 除非你的业务规则允许它,然后字段应该是VARCHAR2并且'MIXED'应该是其中一个值PK列(无论哪个表都在其中)。
在您的情况下,问题是VARCHAR2格式的代码以前导0开头,因此如果您与转换为字符串的数字进行比较,则永远不会得到匹配(并且在外部联接中,始终假定匹配为了NULL)。
相反,当您将数字转换为字符串时,请添加如下所示的前导零:
...on a.ITM_CD = TO_CHAR(b.ITM_CD, '099999')
答案 2 :(得分:0)
您可以修剪字符串列中的前导零。
select
A.ITM_CD
,B.COST
,B.SIZE
,B.DESCRIPTION
,A.HOLD_REASON
from
TABLE1 a
left join TABLE2 b on trim(LEADING '0' FROM a.ITM_CD ) = to_char(b.ITM_CD)