0

我知道可用的课程列表和一个人上过的课程列表。如何以逗号分隔格式选择/输出以下人员未参加的课程,

SELECT to list all courses:
SELECT DISTINCT(COURSE) FROM tblCOURSE

SELECT to list all courses taken by user
SELECT DISTINCT(COURSE) FROM tblCOURSE WHERE pid='XXXXX' 

我想用 将LISTAGG(COURSETYPE, ',') WITHIN GROUP (ORDER BY pid,course)它们列为`COURSE2,COURSE4,COURSE5,COURSE6,COURSE7,。

示例:说可用的课程列表是: COURSE1,COURSE2,COURSE3,COURSE4,COURSE5,COURSE6,COURSE7,COURSE8

个人参加的课程列表XXXXX是: COURSE1,COURSE3,COURSE8

SELECT 输出/结果应该是:

 PID         COURSES
--------------------------------------------------
 XXXXX    COURSE2,COURSE4,COURSE5,COURSE6,COURSE7`
--------------------------------------------------

COURSESpidXXXXX没有使用的课程列表在哪里。

4

2 回答 2

2
create table tblcourse(pid number,course varchar2(20));


Insert into TBLCOURSE  (PID, COURSE) Values (1, 'COURSE1');
Insert into TBLCOURSE  (PID, COURSE) Values (1, 'COURSE3');
Insert into TBLCOURSE  (PID, COURSE) Values (1, 'COURSE5');
Insert into TBLCOURSE  (PID, COURSE) Values (2, 'COURSE8');
Insert into TBLCOURSE  (PID, COURSE) Values (3, 'COURSE8');
Insert into TBLCOURSE  (PID, COURSE) Values (4, 'COURSE2');
Insert into TBLCOURSE  (PID, COURSE) Values (5, 'COURSE4');
Insert into TBLCOURSE  (PID, COURSE) Values (5, 'COURSE6');
COMMIT;

询问 :

WITH TAB AS 
(
 SELECT DISTINCT(COURSE) as course  
   FROM tblcourse --distinct courses  
MINUS   
 SELECT DISTINCT(COURSE) as course  
  FROM tblcourse 
 WHERE pid=:pid --will give you distinct courses that pid subscribe
)
SELECT  :pid,LISTAGG(COURSE, ',') WITHIN GROUP (ORDER BY COURSE) as courses 
  FROM TAB;

结果如你所愿: pass pid as 1

PID           COURSES
-------------------------
 1            COURSE2,COURSE4,COURSE6,COURSE8

SQLFIDDLE 中的试用示例

编辑

我想不出更好的解决方案,可能有人可以提出更好的方法来做到这一点,同时你可以看看这个,但有时笛卡尔积会摇摆不定:)

WITH course_cartesian as (
       SELECT pid,course 
         FROM (SELECT DISTINCT course 
                 FROM tblcourse)q1,
              (SELECT DISTINCT pid 
                 FROM tblcourse)q2 
             ORDER BY pid,course
   )
,tbl_course AS(SELECT pid,course 
                 FROM course_cartesian
                MINUS
              SELECT pid,course FROM tblcourse
              )
SELECT pid,listagg(course,',') WITHIN GROUP (ORDER BY course) as courses 
  FROM   tbl_course  
 GROUP BY pid 
 ORDER BY pid;

输出

输出

SQLFIDDLE链接

于 2012-06-16T14:53:57.943 回答
0

基本选择将类似于:

SELECT :pid, LISTAGG(C, ',') WITHIN GROUP ORDER BY course FROM
(
  SELECT DISTINCT(COURSE) as C FROM tblCOURSE
  MINUS
  SELECT DISTINCT(COURSE) as C FROM tblCOURSE WHERE pid=:pid
)

将 :pid 替换为您正在查找的 id。

(这是未经测试的,我在网上查了 LISTAGG 语法)

于 2012-06-16T14:31:57.180 回答