记录一下SQL外连接的一些心得

业务要求,外连接查询多表关联,查出来之后保存到浏览器缓存中然后请求转发,把request的缓存带到JSP里面
用request域存值,就一定要转发,转发就能把页面停在detail.do上面,但是如果用了重定向,就会把页面送到detail.jsp上面,页面数据带不过去。如果数据有刷新的话显示不出来,所以就要用请求转发
在这里插入图片描述
到这里业务描述完毕,看没改之前的SQL

select
            tran.id,
            user.name as owner,
            tran.money,
            tran.name,
            tran.expectedDate,
            cus.name as customerId,
            tran.stage,
            tran.type,
            tran.source,
            act.name as activityId,
            con.fullname as contactsId,
            tran.createBy,
            tran.createTime,
            tran.editBy,
            tran.editTime,
            tran.description,
            tran.contactSummary,
            tran.nextContactTime
        from tbl_tran tran
            join tbl_user user
            on tran.owner=user.id
            join tbl_customer cus
            on tran.customerId=cus.id
            join tbl_activity act
            on tran.activityId=act.id
            join tbl_contacts con
            on tran.contactsId=con.id

        where tran.id=#{id}

重点主要在连接那里,注意此时内连接还没改成左外连接,此时一旦下面的那些非必填字段参与到了查询,连接到了null,整篇查询直接全变成null,读不到任何值了
下面加以更改,主要是加上了左外连接,只有一部分代码

from tbl_tran tran
            join tbl_user user
            on tran.owner=user.id
            join tbl_customer cus
            on tran.customerId=cus.id
            left join tbl_activity act
            on tran.activityId=act.id
            left join tbl_contacts con
            on tran.contactsId=con.id

此时加上了左外连接就可以避免查询到null值整张表都废掉的情况

主要作用就是保住了左表的数据,左表即为主表,另外的那个就是从表 left join…on…

将返回右表的所有行。如果左表的某行在右表中没有匹配行,则将为右表返回空值左表里面的对应行的值
  两表都有值的话还好说,如果左表有值右表为null的情况下,就返回左表的值。LEFT JOIN 关键字会从左表那里返回所有的行,即使在右表中没有匹配的行。

=============================================

抄来的笔记
SQL的四种连接-左外连接、右外连接、内连接、全连接
内连接inner join…on… / join…on…

展现出来的是共同的数据(两张表的交集)

select m.Province,S.Name from member m inner join ShippingArea s on m.Province=s.ShippingAreaID;

相当于:select m.Province,S.Name from member m , ShippingArea s where m.Province=s.ShippingAreaID;

左连接(左外连接) left join…on…

将返回右表的所有行。如果左表的某行在右表中没有匹配行,则将为右表返回空值左连接:

select m.Province,S.Name from member m left join ShippingArea s on m.Province=s.ShippingAreaID;

以左表为主表,右表没数据为null

右连接(右外连接)right join…on…

将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值;

以右表为主表,左表中没数据的为null

select m.Province,S.Name from member m right join ShippingArea s on m.Province=s.ShippingAreaID;

全外连接FULL JOIN …on…

完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

select m.Province,S.Name from member m full join ShippingArea s on m.Province=s.ShippingAreaID;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值