开发中遇到的SQL问题

SQL问题
  1.1 区分内部关联和外部关联

      普通的JOIN就是内连接,返回A表与B表共有的数据

    清楚LEFT JOIN 等外连接的作用,若 左/右 表字段为null时,返回null

    在 LEFT JOIN 表名 ON 条件后 , 还可以跟上 AND 另外的条件 , 在进行关联时对数据再进一步筛选

    如果是在外部的WHERE进行筛选条件的增加则是对已经关联后形成的数据再进一步筛选

  1.2 FROM多表情况下的LEFT JOIN问题 (https://blog.csdn.net/YL3126/article/details/115728744)

  问题语句:

select 
 
a.id as aid,
b.id as bid,
c.id as cid
 
from
 
a,b,c
 
where
 
a.id=b.aid
c.id=b.cid
 

  若直接写成

select 
 
a.id as aid,
b.id as bid,
c.id as cid,
e.id as eid
 
from
 
a,b,c
 
left join e a.id=e.aid
 
where
 
a.id=b.aid
c.id=b.cid

  这种写法会报多列引用的错误,因为这种方式会认为前面的三张表的结果为一个数据集,所以找不到 a 表的对应关系

    方法一:将a,b,c的查询作为一个结果集再LEFT JOIN新表

select
 *
from
 
( select 
 
a.id as aid,
b.id as bid,
c.id as cid,
e.id as eid
 
from
 
a,b,c
 
where
 
a.id=b.aid
c.id=b.cid ) AS m left join e on m.aid=e.aid

  方法二:由于  from 多表 == inner join,可以改造此SQL

select 
 
a.id as aid,
b.id as bid,
c.id as cid,
e.id as eid
 
from
 
a
 
inner join b on a.id=b.aid
 
inner join c c.id=b.cid
 
left join e a.id=e.aid

  方法三:从a表一直外连接到e表,需要配合业务场景使用

select 

a.id as aid,
b.id as bid,
c.id as cid,
e.id as eid

from

a

left join b on a.id = b.aid
left join c on b.id = c.bid
left join e on c.id = e.cid

 

posted @ 2022-05-29 10:08  YoProgrammer  阅读(75)  评论(0)    收藏  举报