有两个表,其中一个表A是如下:
  Name  code  count
  张三 1     90
  李四 3     89
  另有一表B如下:
  code   pname
  1  英语
  2      语文
  3      数学
  要求联合查询后,结果如下
  Name  pname  count
  张三 1     90
  张三 2     0
  张三 3     0
  李四 1     0
  李四 2     0
  李四 3     89
  也就是说,按照人名进行扩展,如张三按照B表扩展了3条记录,张三没有成绩的课程成绩为0,该如何实现呢?

解决方案 »

  1.   

    with stu as(
    select '张三' name, 1 code, 90 grade from dual 
    union all
    SELECT '李四',3,89 from dual
    )
    ,
    course as(
    select 1 code, '英语' pname from dual
    union all
    select 2, '语文' from dual
    union all
    select 3, '数学' from dual
    )
    select  a.name , a.code,a.pname ,Nvl(s.grade,0)
    from (select a.name,b.code,b.pname from stu a,course b) a
    left join stu s
    on a.name=s.name and a.code=s.code
    order by a.name , a.code
      

  2.   

    select  a.name , b.code,b.pname ,nvl(s.grade,0)
    from stu a join course b on 1=1
    left join stu s
    on a.name=s.name and b.code=s.code
    order by a.name , b.code
      

  3.   

    还是有问题。如果加入
    union all
    SELECT '李四',2,8 from dual
    最后会出来9行数据,而不是6行
      

  4.   

    SQL> WITH stu AS(
      2    SELECT 'AA' uname, 1 code, 90 grade FROM DUAL UNION ALL
      3    SELECT 'BB',3,89 FROM DUAL UNION ALL
      4    SELECT 'BB',2,8 FROM DUAL
      5  )
      6  ,
      7  course AS(
      8    SELECT 1 code,'English' pname FROM DUAL UNION ALL
      9    SELECT 2,'Chinese' FROM DUAL UNION ALL
     10    SELECT 3,'Math' FROM DUAL
     11  )
     12  SELECT s.uname,c.pname,nvl(s.grade,0) grade
     13    FROM course c
     14    LEFT JOIN stu s PARTITION BY(s.uname) ON c.code = s.code
     15  ORDER BY s.uname,c.code
     16  ;UNAME PNAME        GRADE
    ----- ------- ----------
    AA    English         90
    AA    Chinese          0
    AA    Math             0
    BB    English          0
    BB    Chinese          8
    BB    Math            89
      

  5.   

    你是在啥子数据库中用的,我在oracle9中用报 缺少关键字 错误
      

  6.   

    9i:
    WITH stu AS(
      SELECT 'AA' uname, 1 code, 90 grade FROM DUAL UNION ALL
      SELECT 'BB',3,89 FROM DUAL UNION ALL
      SELECT 'BB',2,8 FROM DUAL 
    ),
    course AS(
      SELECT 1 code,'English' pname FROM DUAL UNION ALL
      SELECT 2,'Chinese' FROM DUAL UNION ALL
      SELECT 3,'Math' FROM DUAL 
    ),t1 AS (
        SELECT * FROM (SELECT DISTINCT uname FROM stu),
                      (SELECT DISTINCT code,pname FROM course)
    )
    SELECT t1.uname,
           t1.pname,
           NVL(t2.grade, 0)
      FROM t1
      LEFT JOIN stu t2 ON t1.code = t2.code
                      AND t1.uname = t2.uname
     ORDER BY t1.uname,
              t1.code