join on后面过滤条件有时不生效

在项目开发中,我们用的join一般有left join、right join和inner join。有时候会发现写在on后面的过滤条件有时候不生效。

问题

最近项目上反馈,角色类别表数据被删除,但是在角色树上仍然能够被查出来。查看接口代码,发现查询sql用的left join。

sql语句类似如下

select js.id as id, js.mc as jsmc,fl.id as flId, fl.mc as flmc

from JS_LB fl left join on JS js on fl.id = js.js_lb_id and fl.sfsc = 'N'

where js.sfsc = 'N' or js.sfsc is null

查看上面sql,发现有2个问题:

1、为啥fl.sfsc = 'N'怎么没生效?

2、为什么JS表过滤条件用到了or,这不是很影响性能?

原因

带着上面2个疑问,查了资料,发现

join类型过滤条件是否生效原因

A left join B on A.xx = B.xx1 and A.条件1

and B.条件2

where A.条件3

and B.条件4

where后面条件都生效

A.条件1 不生效

B.条件2 生效

left join是会返回A表的全量数据,对A表的过滤条件失败
A right join B

on A.xx = B.xx1 and A.条件1

and B.条件2

where A.条件3

and B.条件4

where后面条件都生效

A.条件1 生效

B.条件2 不生效

right join是会返回B表的全量数据,对B表的过滤条件失败
A inner join B

on A.xx = B.xx1 and A.条件1

and B.条件2

where A.条件3

and B.条件4

where后面条件都生效

A.条件1 生效

B.条件2 生效

inner join,是对A表进行条件过滤之后,再join B表进行条件过滤之后的数据

针对这2点。上面的sql,可以修改成,这样就只会查出角色分类表和角色表未删除数据,不影响性能

select js.id as id, js.mc as jsmc,fl.id as flId, fl.mc as flmc

from JS_LB fl left join on JS js on fl.id = js.js_lb_id and js.sfsc = 'N' 

where fl.sfsc = 'N'

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: left join on后面跟的条件是指连接左表和右表时所使用的条件,通常是两个表之间的共同字段或者相关字段。这个条件用来指定左表和右表之间的关联关系,以便在查询结果中返回相关的数据。例如,如果我们要查询一个订单表和一个客户表,可以使用left join on语句将这两个表连接起来,然后指定订单表和客户表之间的关联关系,比如订单表中的客户ID字段和客户表中的ID字段相等。这样就可以在查询结果中返回订单和客户的相关信息了。 ### 回答2: 在使用LEFT JOIN语句时,后面跟随的条件对于查询结果非常重要。LEFT JOIN是一种联接操作,它返回左表中的所有行,而右表中匹配的行将与左表中的行进行合并。在这种情况下,后面跟随的条件将决定哪些行将被合并。 通常情况下,LEFT JOIN条件通常是指定连接表之间的关联。这个条件是使用ON关键字指定的,它决定哪些列将被用于比较和匹配。 例如,我们有两个表A和B,我们想要根据它们的共同列id进行连接。查询语句可能如下所示: SELECT * FROM tableA LEFT JOIN tableB ON tableA.id = tableB.id; 在这个例子中,条件“tableA.id = tableB.id”指定了两个表之间的关系,即根据它们的id列进行连接。这意味着只有当tableA和tableB中id列的值相等时,才会产生匹配的行。 在LEFT JOIN中,当指定的条件无法找到匹配的值时,会返回NULL值。这就是LEFT JOIN的特点之一。如果没有指定连接条件,LEFT JOIN将返回左表的所有行,并将右表的匹配列设置为NULL。 总之,LEFT JOIN后面跟随的条件在决定连接的结果和匹配行时起重要作用。它可以根据需要自定义,以满足查询的要求。 ### 回答3: 在SQL中,LEFT JOIN 是一种关联查询的方式,它会返回左表中所有的行,而右表中与左表匹配的行将作为结果返回。在进行 LEFT JOIN 操作时,我们需要指定一个或多个条件来关联左表和右表,这些条件通常称为 ON 条件。 ON 后面跟的条件用于指定左表和右表之间的关联关系。这些条件可由一个或多个关系运算符(如等于、大于、小于等)和逻辑运算符(如 AND、OR)组成。常见的 ON 条件包括两个表之间的列相等判断或者其他列之间的相关逻辑判断。 例如,假设有两个表 A 和 B,它们的结构如下: 表 A: | id | name | |----|-------| | 1 | John | | 2 | Emma | | 3 | Peter | 表 B: | id | age | |----|-----| | 1 | 25 | | 2 | 30 | | 4 | 40 | 如果我们想要通过 id 列将表 A 和表 B 进行关联,我们可以使用以下的 SQL 语句: SELECT A.id, A.name, B.age FROM A LEFT JOIN B ON A.id = B.id; 这个语句将返回一个结果集,其中包括表 A 中的所有行,以及与之匹配的表 B 的行,对于在表 B 中没有匹配到的行,对应列的值将为 NULL。也就是说,该语句会返回以下结果: | id | name | age | |----|-------|-----| | 1 | John | 25 | | 2 | Emma | 30 | | 3 | Peter | NULL| 所以,在 LEFT JOIN 后面条件中,我们可以根据需要指定表之间的关联条件,以达到我们需要的查询结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值