好吧,我承认我很菜,第一次碰到.第二行 "ON" 后面的内容 没有 "=" 号 PUBAREA 地区表,里面包含地区,省,市3级 分别是2位,4位,6位编码.后面的____ 4个下划线取到了"省"这一级
LEFT JOIN PUBArea PA ON PA.AreaCode=PEp.AreaCode
LEFT JOIN PUBArea PA2 ON PEp.AreaCode like PA2.AreaCode + '%' and PA2.AreaCode like '____'我改变了下划线2位或者6位,发现可以影响到取数.请教 left join ......on 后面不加等号 什么情况下可以用.为什么?
LEFT JOIN PUBArea PA ON PA.AreaCode=PEp.AreaCode
LEFT JOIN PUBArea PA2 ON PEp.AreaCode like PA2.AreaCode + '%' and PA2.AreaCode like '____'我改变了下划线2位或者6位,发现可以影响到取数.请教 left join ......on 后面不加等号 什么情况下可以用.为什么?
----相当于---->
LEFT JOIN PUBArea PA2 ON PEp.AreaCode=left(PA2.AreaCode,len(PEp.AreaCode)) and len(PA2.AreaCode)=4
第二句,条件里有对右表的独立约束:PA2.AreaCode like '____' ,从而那些右表无的记录不会被选出来。其效果等同于inner join.与是否用=号无关。
ON 指定连接条件而连接条件是个表达式,表达式可以返回逻辑结果就可以了, 并不一定要求表达式里必须用=号。
_是like的通配符,匹配一个字符。这些都是基础知认。
对于on 和where:
当为内连接,二者功能一样,但还是建议区别开来写,语义明确。
对于外连接,二者差别很大,on的条件里,当不满足时,首输入端(比如左连时,左输入为首输入端,右外连时反之)有输出,而次输入端输出NULL. 而where里条件,当不满足时,当前行被舍弃,而不是一端有输出另一端为null.
left join ....on 后面是表之间的符合条件的所有匹配, PA.AreaCode=PEp.AreaCode 和PEp.AreaCode like PA2.AreaCode + '%' and PA2.AreaCode like '____'
都是两个匹配条件,只不过 前面那个是等值匹配
不管怎样,left join 最少返回left join 的表的所有记录
SELECT a.au_fname, a.au_lname, p.pub_name,p2.pub_name
FROM authors a LEFT OUTER JOIN publishers p
ON a.city = p.city
left join publishers p2 on len(p2.pub_name)=5
ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC