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`
--------------------------------------------------

COURSESもちろんpidXXXXXが取っていないリストはどこにありますか。

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 に答える