/*Tables:*/
SELECT tid, SID FROM t_s_map;/*student id whom teacher has access*/
SELECT sgid FROM sg;/* student_group table*/
SELECT sgid, SID FROM sgm;/*student group members table(info of students under student group)*/
/*Note: All columns are id and have values > 0*/
的樣本數據:備用左加入
Table: sg
sgid
101
201
Table: sgm
sgid sid
101 1
101 2
101 3
201 1
201 2
Table: t_s_map
tid sid
11 1
11 2
11 3
22 1
22 2
問題陳述:其中一名教師先後獲得學生組的
獲取列表(如果老師對學生下訪問所有學生那麼只有那個學生組可以訪問)。 因此,對於tid = 11可訪問的學生組是sgid = 101和sgid = 201,而對於tid = 22是sgid = 201。
SELECT sg.sgid
FROM sg
JOIN sgm
ON (sg.sgid = sgm.sgid)
LEFT OUTER JOIN t_s_map
ON (sgm.SID = t_s_map.SID)
WHERE t_s_map.tid = 22
GROUP BY sg.sgid
HAVING MAX (NVL(t_s_map.SID, 0)) > 0 AND MIN (NVL(t_s_map.SID, 0)) > 0;
現在上面的查詢工作正常,但它的速度慢,有沒有備用(快)的方式來做到這一點。
當前版本:
SELECT sgm.sgid
FROM sgm
LEFT OUTER JOIN t_s_map
ON (sgm.SID = t_s_map.SID)
WHERE t_s_map.tid = 22
GROUP BY sgm.sgid
HAVING MIN (NVL(t_s_map.SID, 0)) > 0;
您是否嘗試過向表中添加索引?這可以加快查詢速度。 –
請注意,您的左連接完全沒有意義,因爲您將謂詞應用於外連接到的表:「where t_s_map.tid = 1234」 –
您不需要'MAX',因爲如果MIN> 0,則MAX > = MIN> 0' – MT0