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

Posted

技术标签:

【中文标题】如何编写两个表的正确左连接?【英文标题】:How to write correct left Join of two tables? 【发布时间】:2020-08-15 15:57:08 【问题描述】:

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

我试过这段代码,但第二个表的所有值都是空的。这是为什么呢?

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

【问题讨论】:

换个方式试试a.act_phone_no = TO_NUMBER(c.msisdn_voice) 听起来msisdn_voice 包含不可见字符。您可以使用DUMP 进行检查,例如选择 msisdn_voice, dump(msisdn_voice) from customer where msisdn_voice like '%23434%'; 你为什么不给我们看一个完整的测试用例?您的 SELECT 引用的列名称未出现在您声称要显示的任何一个(未识别的)表中。一个测试用例包括创建必要表的实际 ddl,以及用最少的测试数据填充它们的实际 INSERT。 【参考方案1】:

看来你没有告诉我们一切。在这样的样本数据上查询works(如果编写正确):

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>

可能出了什么问题?谁知道。如果您得到 some 结果,但 CUSTOMER 表中的列是空的 (NULL?),那么它们可能真的是 NULL,或者您没有设法连接这些列上的行(左/右填充空格?)。是否加入例如

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

on a.act_phone_no = to_number(c.msisdn_voice)

帮助?

考虑发布适当的测试用例(CREATE TABLEINSERT INTO 语句)。

【讨论】:

【参考方案2】:

您使用的是 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;

SQLFiddle

【讨论】:

以上是关于如何编写两个表的正确左连接?的主要内容,如果未能解决你的问题,请参考以下文章

当涉及两个以上的表时,如何将来自相似字段的单个表的两个左连接转换为 LINQ? [复制]

如何在 Laravel 5.1 中编写这个(左连接、子查询)?

如何编写基于另一个表过滤表的Hive查询?

如何在sql中连接来自不同表的两个字段

C# SqlCommandBuilder,CommandUpdate - 如何使用外部连接表编写基于选择的正确更新

比较与特定字段有关的两个表之间的差异时如何正确连接