Oracle 如何编写两个表的正确左联接?

Oracle 如何编写两个表的正确左联接?,oracle,oracle11g,Oracle,Oracle11g,我想连接两个表,第一个表主键数据类型是number,第二个表主键数据类型是VARCHAR2(30字节)。如何连接两个表 我尝试了这段代码,但第二个表中的所有值都为空。为什么呢 SELECT a.act_phone_no,a.act_actdevice,a.bi_account_id, a.packag_start_date, c.identification_number, FROM ACTIVATIONS_POP a left JOIN customer c on TO_CHAR(a.act

我想连接两个表,第一个表主键数据类型是number,第二个表主键数据类型是VARCHAR2(30字节)。如何连接两个表

我尝试了这段代码,但第二个表中的所有值都为空。为什么呢

SELECT a.act_phone_no,a.act_actdevice,a.bi_account_id, a.packag_start_date, c.identification_number, 
FROM ACTIVATIONS_POP a
left JOIN customer c
on TO_CHAR(a.act_phone_no) = c.msisdn_voice
第一桌

act_phone_no   bi_account_id
23434             45345
34245             43556    
第二桌

msisdn_voice    identification_number
23434              321113
34245              6547657

看来你没有把一切都告诉我们。如果正确编写查询,则该查询可用于以下示例数据:

SQL> with
  2  -- Sample data
  3  activations_pop (act_phone_no, bi_account_id) as
  4    (select 23434, 45345 from dual union all
  5     select 34245, 43556 from dual
  6    ),
  7  customer (msisdn_voice, identification_number) as
  8    (select '23434', 321113  from dual union all
  9     select '34245', 6547657 from dual
 10    )
 11  -- query works OK
 12  select a.act_phone_no,
 13         a.bi_account_id,
 14         c.identification_number
 15  from activations_pop a join customer c on to_char(a.act_phone_no) = c.msisdn_voice;

ACT_PHONE_NO BI_ACCOUNT_ID IDENTIFICATION_NUMBER
------------ ------------- ---------------------
       23434         45345                321113
       34245         43556               6547657

SQL>
有什么不对劲吗?谁知道呢。如果您得到了一些结果,但是
CUSTOMER
表中的列为空(
NULL
?),那么它们可能真的是
NULL
,或者您没有设法连接这些列上的行(左/右填充空格?)。你喜欢加入吗

on to_char(a.act_phone_no) = trim(c.msisdn_voice)

帮忙


考虑发布适当的测试用例(
createtable
INSERT-INTO
语句)。

您似乎没有告诉我们所有的事情。如果正确编写查询,则该查询可用于以下示例数据:

SQL> with
  2  -- Sample data
  3  activations_pop (act_phone_no, bi_account_id) as
  4    (select 23434, 45345 from dual union all
  5     select 34245, 43556 from dual
  6    ),
  7  customer (msisdn_voice, identification_number) as
  8    (select '23434', 321113  from dual union all
  9     select '34245', 6547657 from dual
 10    )
 11  -- query works OK
 12  select a.act_phone_no,
 13         a.bi_account_id,
 14         c.identification_number
 15  from activations_pop a join customer c on to_char(a.act_phone_no) = c.msisdn_voice;

ACT_PHONE_NO BI_ACCOUNT_ID IDENTIFICATION_NUMBER
------------ ------------- ---------------------
       23434         45345                321113
       34245         43556               6547657

SQL>
有什么不对劲吗?谁知道呢。如果您得到了一些结果,但是
CUSTOMER
表中的列为空(
NULL
?),那么它们可能真的是
NULL
,或者您没有设法连接这些列上的行(左/右填充空格?)。你喜欢加入吗

on to_char(a.act_phone_no) = trim(c.msisdn_voice)

帮忙

考虑发布适当的测试用例(
createtable
INSERT-INTO
语句)。

您使用的是Oracle吗

请检查下面的演示

SELECT a.act_phone_no, a.bi_account_id, c.identification_number
FROM ACTIVATIONS_POP a
left JOIN customer c
on TO_CHAR(a.act_phone_no) = c.msisdn_voice;
您正在使用Oracle

请检查下面的演示

SELECT a.act_phone_no, a.bi_account_id, c.identification_number
FROM ACTIVATIONS_POP a
left JOIN customer c
on TO_CHAR(a.act_phone_no) = c.msisdn_voice;

试试另一种方法
a.act\u phone\u no=TO\u NUMBER(c.msisdn\u voice)
听起来像msisdn\u voice包含不可见字符。您可以使用
DUMP
检查这一点,例如,从客户处选择msisdn_语音,DUMP(msisdn_语音),其中msisdn_语音类似“%23434%”;为什么不给我们看一个完整的测试用例?SELECT引用的列名不会出现在您声称要显示的任何一个(未标识)表中。测试用例包括实际的ddl以创建必要的表,以及实际的INSERT以用最少的测试数据填充它们。请尝试另一种方法
A.act\u phone\u no=to\u NUMBER(c.msisdn\u voice)
听起来像msisdn\u voice包含不可见的字符。您可以使用
DUMP
检查这一点,例如,从客户处选择msisdn_语音,DUMP(msisdn_语音),其中msisdn_语音类似“%23434%”;为什么不给我们看一个完整的测试用例?SELECT引用的列名不会出现在您声称要显示的任何一个(未标识)表中。测试用例包括创建必要表的实际ddl,以及用最少的测试数据填充表的实际INSERT。