业务要求,外连接查询多表关联,查出来之后保存到浏览器缓存中然后请求转发,把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;