外连接sql的一个问题

来源:互联网 发布:詹姆斯历届总决赛数据 编辑:程序博客网 时间:2024/05/22 01:42

当在内连接查询中加入条件时,无论是将它加入到join子句,还是加入到where子句,其效果是完全一样的,但对于外连接情况就不同了。当把条件加入到 join子句时,会返回外连接表的全部行,然后使用指定的条件返回第二个表的行。如果将条件放到where子句中,将会首先进行连接操作,然后使用where子句对连接后的行进行筛选。例如:

(1)

select u.id, u.p_plan_id, u.unit_name, p.id, p.plan_name
  from t_baidu_p_units u
  left outer join t_baidu_p_plans p on u.p_plan_id = p.id
                                   and p.id = 3176
 where 1 = 1
 order by u.p_plan_id desc

它会返回t_baidu_p_units表中所有行,t_baidu_p_plans表中符合join条件的字段不为null

(2)

select u.id, u.p_plan_id, u.unit_name, p.id, p.plan_name
  from t_baidu_p_units u
  left outer join t_baidu_p_plans p on u.p_plan_id = p.id
                                   and p.id = 3176
 where p.id is null
 order by u.p_plan_id desc

查询的结果集中没有符合join条件的数据

(3)

select u.id, u.p_plan_id, u.unit_name, p.id, p.plan_name
  from t_baidu_p_units u
  left outer join t_baidu_p_plans p on u.p_plan_id = p.id
                                   and p.id = 3176
 where p.id is not null
 order by u.p_plan_id desc

结果集中只包含join条件的数据

分析一下:

  (1)where1=1对其进行过滤时,由于都符合此条件,因此没有改变结果集

  (2)根据where p.id is null对于join后的结果集进行筛选,凡是p.id不为null的都要过滤掉,因此自然没有p.id=3176的结果

  (3)凡是p.id为null的过滤掉,所以只有符合join条件p.id=3176的没有被过滤掉

原创粉丝点击