外键连接,当2个表进行关连时,例如:A.tb_id=B.tb_id,那么如果不符合这一条件的记录将不会被显示使用的外键连接,例如:A.tb_id=B.tb_id(+),B表中的所有数据都会显示,而不在乎是否满足等式条件。

解决方案 »

  1.   

    举个例子:
    --TB_TEMP表中有11个手机号码,需要到TB_PHONE_NO表中查询他们对应的归属地信息(11行输出)。
    SQL> select * from tb_temp;PHONE_NO
    -------------
    13002400001
    13002410001
    13002420001
    13002430001
    13002440001
    13002450001
    13002460001
    13002470001
    13002480001
    13002490001
    15900001111已选择11行。
    --由于TB_PHONE_NO表中没有15900001111的归属数据,所以该行没有正确显示(10行输出)。
    SQL> select a.phone_no,b.city_name from tb_temp A,tb_phone_no B
      2  where substr(A.phone_no,1,7)=B.phone_no;PHONE_NO      CITY_NAM
    ------------- --------
    13002400001   沈阳
    13002410001   沈阳
    13002420001   沈阳
    13002430001   沈阳
    13002440001   沈阳
    13002450001   沈阳
    13002460001   沈阳
    13002470001   沈阳
    13002480001   沈阳
    13002490001   沈阳已选择10行。
    --由于TB_PHONE_NO表中没有15900001111的归属数据,但是使用的外键关系,所以该行仍旧正确显示(11行输出)。
    SQL> select a.phone_no,b.city_name from tb_temp A,tb_phone_no B
      2  where substr(A.phone_no,1,7)=B.phone_no(+);PHONE_NO      CITY_NAM
    ------------- --------
    13002400001   沈阳
    13002410001   沈阳
    13002420001   沈阳
    13002430001   沈阳
    13002440001   沈阳
    13002450001   沈阳
    13002460001   沈阳
    13002470001   沈阳
    13002480001   沈阳
    13002490001   沈阳
    15900001111已选择11行。SQL>
      

  2.   

    DF_4B(机车乘务员) :
    例如:A.tb_id=B.tb_id(+),B表中的所有数据都会显示,而不在乎是否满足等式条件。
    应该是
    "A表中的所有数据都会显示",而不是"B表中的所有数据都会显示" 吧?
      

  3.   

    二楼错了吧 
               a.name=b.name(+) 是左连接  显示A表中所有数据
               a.name(+)=b.name 是右连接  显示B表中所有数据
      

  4.   

    a.name=b.name(+) 是左连接  显示A表中所有数据
      a.name(+)=b.name 是右连接  显示B表中所有数据 没错
      

  5.   

    为什么有时会出现这种错误:
      a table may be outer joined to at most one other table
    ?
      

  6.   

    DF_4B(机车乘务员) 的解释很到位了。别给我分了,就这点。