好吧,我承认我很菜,第一次碰到.第二行 "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 后面不加等号 什么情况下可以用.为什么?

解决方案 »

  1.   

    这里的on 等于 where 
      

  2.   

    相当于两次连接PUBArea表,第一次用等号连接,第二次用like连接.
      

  3.   

    不对,LEFT JOIN PUBArea  PA2 ON PEp.AreaCode like PA2.AreaCode  + '%' and PA2.AreaCode like '____' 
    ----相当于---->
    LEFT JOIN PUBArea  PA2 ON PEp.AreaCode=left(PA2.AreaCode,len(PEp.AreaCode)) and len(PA2.AreaCode)=4 
      

  4.   

    第一句,左边有,右表无的记录也能被查出来。右表PA无的以null顶替。
    第二句,条件里有对右表的独立约束:PA2.AreaCode like '____' ,从而那些右表无的记录不会被选出来。其效果等同于inner join.与是否用=号无关。
      

  5.   


    ON 指定连接条件而连接条件是个表达式,表达式可以返回逻辑结果就可以了, 并不一定要求表达式里必须用=号。
    _是like的通配符,匹配一个字符。这些都是基础知认。
    对于on 和where:
    当为内连接,二者功能一样,但还是建议区别开来写,语义明确。
    对于外连接,二者差别很大,on的条件里,当不满足时,首输入端(比如左连时,左输入为首输入端,右外连时反之)有输出,而次输入端输出NULL. 而where里条件,当不满足时,当前行被舍弃,而不是一端有输出另一端为null.
      

  6.   

    这因该没问题啊
    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