【问题标题】:sql left join returnssql左连接返回
【发布时间】:2015-01-20 07:12:21
【问题描述】:

我正在尝试在 2 个表上运行左联接。我没有 group by,我唯一的条件是在第二张桌子上。但是,返回的行数少于第一个表。不是左连接假设从第一个表中获取所有数据吗? 这是我的 SQL:

select * 
  from tbl_a A left join tbl_b B
     ON
       A.Cnumber=B.Cnumber
       and A.CDNUmber=B.CDNumber
       and abs(A.duration - B.Duration)<2
       and substr(A.text,1,3)||substr(A.text,5,8)||substr(A.text,9,2)=substr(B.text,1,8)
where B.fixed = 'b580'

表A有140000条记录,但返回的结果少于100000条记录。有什么问题,我该如何解决?

【问题讨论】:

  • 我的主要问题是在结果中获得准确的 140000 条记录,如果条件匹配,有些记录有 tbl_b 记录,有些则不匹配
  • 实际上我不能提供样本,但举个例子:考虑在学校匹配 2 个列表。一个为学校创建的全体学生。另一个由各自的部委创建。部委名单有更多记录。我想知道部列表中的哪些记录不在我们的列表中。没有一个表有主键,4 列一起可以使记录唯一。

标签: sql left-join conditional-statements records


【解决方案1】:

只要您在 WHERE 子句中添加了一个条件,该条件引用了正确的表并且不适应连接不成功时将产生的 NULLs,您就已经(有效地)将其转换回来变成INNER JOIN

试试:

where B.fixed = 'b580' OR B.fixed IS NULL

或者将此条件添加到JOINON 子句中。

【讨论】:

  • 我将条件从 [where] 移至 [ON]。记录数上升到 280000。我想我可能有多个匹配项。我说的对吗?
  • 是的,这听起来很可能。如果您没有看到您想要的结果,您能否用一些示例数据和您想要达到的结果更新您的问题?
  • I tbl_c 并在其中插入了连接的结果,然后我尝试使用此代码删除结果中的重复项: select count(*) from tbl_C where rowid not in ( select min(rowid) from tbl_c group by Cnumber1 ,CDNUmber2 ,duration1,text1; 结果到了150000条记录,为什么还是比第一张表多?
  • 我在查询中提到的所有字段都来自第一个表。
【解决方案2】:

您应该将 where 子句添加到连接中:

select * 
  from tbl_a A left join tbl_b B
     ON
       A.Cnumber=B.Cnumber
       and A.CDNUmber=B.CDNumber
       and abs(A.duration - B.Duration)<2
       and substr(A.text,1,3)||substr(A.text,5,8)||substr(A.text,9,2)=substr(B.text,1,8)
  and B.fixed = 'b580'

如果你使用 where 语句,所有 b 不存在的记录都不会返回。

【讨论】:

  • 我现在有额外的记录,即使在新列表中删除重复项也是如此。?!?!
  • 你能添加一些示例数据吗?
  • 实际上我不能提供样本,但举个例子:考虑在学校匹配 2 个列表。一个为学校创建的全体学生。另一个由各自的部委创建。部委名单有更多记录。我想知道部列表中的哪些记录不在我们的列表中。没有一个表有主键,4 列一起可以使记录唯一 列一起可以使记录唯一。
猜你喜欢
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 2013-03-01
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多