Oracle 可选的选择值

Nar*_*ana 2 oracle oracle-8i

我正在编写查询以选择具有他们的计划、国家和教师的学生。到目前为止,我有以下查询:

SELECT H.STUDENT_CODE,
       H.FIRSTNAME,
       H.LASTNAME,
       H.PROGRAM,
       H.TEACHER_CODE,
       H.COUNTRY_CODE,
       AC.COUNTRY_NAME,
       P.PROGRAM_NAME,
       T.TEACHER_NAME
    FROM HTUD H,
         PROGRAM P,
         TEACHER T,
         AP_COUNTRY AC
    WHERE H.FIRSTNAME LIKE '%ark%'
        AND H.PROGRAM = P.PROGRAM
        AND H.TEACHER_CODE = T.TEACHER_CODE
        AND H.COUNTRY_CODE = AC.COUNTRY_CODE
    ORDER BY H.STUDENT_CODE ASC 
Run Code Online (Sandbox Code Playgroud)

这两列 H.TEACHER_CODE 和 H.COUNTRY_CODE 有一些空值。如果我运行上面的查询,它只会返回在 H.TEACHER_CODE 和 H.COUNTRY_CODE 这两列中有数据的学生。

但是,我想选择所有学生,无论他们是否在这两列中有数据。如果他们在 H.TEACHER_CODE 和 H.COUNTRY_CODE 列中有数据,那么也返回教师和国家,如果他们没有,只返回没有教师或国家的学生。

那么,我如何选择有或没有老师或国家的所有学生?

mir*_*173 5

您想进行外连接。在Oracle 8i中,必须使用(+)符号

SELECT H.STUDENT_CODE,
   H.FIRSTNAME,
   H.LASTNAME,
   H.PROGRAM,
   H.TEACHER_CODE,
   H.COUNTRY_CODE,
   AC.COUNTRY_NAME,
   P.PROGRAM_NAME,
   T.TEACHER_NAME
FROM HTUD H,
     PROGRAM P,
     TEACHER T,
     AP_COUNTRY AC
WHERE H.FIRSTNAME LIKE '%ark%'
    AND H.PROGRAM = P.PROGRAM
    AND H.TEACHER_CODE = T.TEACHER_CODE(+)
    AND H.COUNTRY_CODE = AC.COUNTRY_CODE(+)
ORDER BY H.STUDENT_CODE ASC 
Run Code Online (Sandbox Code Playgroud)

Oracle 10g开始xou 也可以使用 ANSI 连接语法

SELECT H.STUDENT_CODE,
   H.FIRSTNAME,
   H.LASTNAME,
   H.PROGRAM,
   H.TEACHER_CODE,
   H.COUNTRY_CODE,
   AC.COUNTRY_NAME,
   P.PROGRAM_NAME,
   T.TEACHER_NAME
FROM HTUD H JOIN PROGRAM P ON (H.PROGRAM = P.PROGRAM)
    LEFT OUTER JOIN TEACHER T ON (H.TEACHER_CODE = T.TEACHER_CODE)
    LEFT OUTER JOIN AP_COUNTRY AC ON (H.COUNTRY_CODE = AC.COUNTRY_CODE)
WHERE H.FIRSTNAME LIKE '%ark%'
ORDER BY H.STUDENT_CODE ASC 
Run Code Online (Sandbox Code Playgroud)