为什么table2中没有对应的字段时,什么都显示不出来

解决方案 »

  1.   

    最好看看概念。
    oracle sql reference讲解很清楚。
      

  2.   

    简单来讲
    主表a,子表b
    select a.*,b.* from a,b where a.id=b.id(+);
    原因是子表b在a表中没有对应记录,但主表所有记录必须全显示,那做一个左连接,保证主表没有对应的记录情况下也全显示,而b表没有对应记录只能显示为null.
      

  3.   

    SQL> select id from tab1;ID
    ----------
    1
    2
    3SQL> select id from tab2;ID
    ----------
    2
    3
    4SQL> 
    SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id=tab2.id;ID         ID
    ---------- ----------
    2          2
    3          3SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id(+)=tab2.id;ID         ID
    ---------- ----------
    2          2
    3          3
               4SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id=tab2.id(+);ID         ID
    ---------- ----------
    1
    2          2
    3          3
    没有值可以“等联接”出来的字段为空值
      

  4.   

    SQL> select id from tab1;ID
    ----------
    1
    2
    3SQL> select id from tab2;ID
    ----------
    2
    3
    4SQL> 
    SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id=tab2.id;ID         ID
    ---------- ----------
    2          2
    3          3SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id(+)=tab2.id;ID         ID
    ---------- ----------
    2          2
    3          3
               4SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id=tab2.id(+);ID         ID
    ---------- ----------
    1
    2          2
    3          3
    没有值可以“等联接”出来的字段为空值
      

  5.   

    学生表
        学号 姓名
        0001 小李
        0002 小王
        0003 小朱
        0004 小黄
    选课表
        学号 课程
        0001 高数
        0002 线数
        0004 英语
        0005 电脑--左(外)联接
    SELECT 学生表.*, 选课表.课程
    FROM 学生表, 选课表
    WHERE 学生表.学号 = 选课表.学号(+)
    查询的结果是:
        学号 姓名 课程
        0001 小李 高数
        0002 小王 线数
        0003 小朱
        0004 小黄 电脑
    学生表.学号 = 选课表.学号(+)表示
    学生表(也就是左边的表)所有行都会被返回
    即使选课表中没有相应的行与学生表中的行匹配--右(外)联接
    SELECT 学生表.*, 选课表.课程
    FROM 学生表, 选课表
    WHERE 学生表.学号(+) = 选课表.学号
    查询的结果是:
        学号 姓名 课程
        0001 小李 高数
        0002 小王 线数
        0004 小黄 电脑
        0005      电脑
    学生表.学号(+) = 选课表.学号表示
    选课表(也就是右边的表)所有行都会被返回
    即使学生表中没有相应的行与选课表中的行匹配
    不同的数据库系统对外联接有不同的表示
    有此根本不兼容如(还是以上例为基础)MS SQL SERVER 外联接的SQL写法
      --左(外)联接 - 第一种写法
      SELECT 学生表.*, 选课表.课程
      FROM 学生表, 选课表
      WHERE 学生表.学号 *= 选课表.学号
      --左(外)联接 - 第二种写法
      SELECT 学生表.*, 选课表.课程
      FROM 学生表 LEFT OUTER JOIN 选课表 ON 学生表.学号 = 选课表.学号
      --右(外)联接 - 第一种写法
      SELECT 学生表.*, 选课表.课程
      FROM 学生表, 选课表
      WHERE 学生表.学号 =* 选课表.学号
      --右(外)联接 - 第二种写法
      SELECT 学生表.*, 选课表.课程
      FROM 学生表 RIGHT OUTER JOIN 选课表 ON 学生表.学号 = 选课表.学号
      --注:在MS SQL SERVER中,OUTER关健字可以省略ACCESS 外联接的SQL写法
      --左(外)联接 - 第二种写法
      SELECT 学生表.*, 选课表.课程
      FROM 学生表 LEFT OUTER JOIN 选课表 ON 学生表.学号 = 选课表.学号
      --右(外)联接 - 第二种写法
      SELECT 学生表.*, 选课表.课程
      FROM 学生表 RIGHT OUTER JOIN 选课表 ON 学生表.学号 = 选课表.学号
      --注:在ACCESS中,关健字OUTER不可以省略ORACLE 外联接的SQL写法
      --左(外)联接 - 第一种写法
      SELECT 学生表.*, 选课表.课程
      FROM 学生表, 选课表
      WHERE 学生表.学号 = 选课表.学号(+)
      --右(外)联接 - 第一种写法
      SELECT 学生表.*, 选课表.课程
      FROM 学生表, 选课表
      WHERE 学生表.学号(+) = 选课表.学号ORACLE直到9i才支持SQL-92外联接语法
    LEFT (OUTER)JOIN和RIGHT (OUTER) JOIN
    和MS SQL SERVER一样
    关健字OUTER是可以省略的
      

  6.   

    LEFT OUTER JOIN—This returns all the rows from the table on the left side of the join, along with the values from the right-hand side, or nulls if a matching row doesn't exist. 
      
    RIGHT OUTER JOIN—This returns all the rows from the table on the right side of the join, along with the values from the left-hand side, or nulls if a matching row doesn't exist. 
      
    FULL OUTER JOIN—This returns all rows from both tables, filling in any blanks with nulls. There is no equivalent for this in Oracle8i.