2011-12-19 82 views
0
(SELECT s.sid, s.sname, e.ccode 
FROM student s INNER JOIN enrolled e 
ON s.sid = e.sid 
WHERE s.programme = 'IT') 
WHERE EXISTS 
(SELECT c.ccode, c.tid 
FROM class c INNER JOIN tutor t 
ON c.tid = t.tid 
WHERE t.tname = 'Hoffman'); 

這就是我到目前爲止,雖然不工作。需要從在一類被稱爲霍夫曼導師招收學生表中獲取IT學生的名字,都來自就讀,階級和導師表。 我在哪裏錯了?SQL連接4表

類:

ccode | cname   | weekday | meets at | room | tid 
________________________________________________________________________ 
CIS166 | Intro to Comp | Tue  | 10:00:00 | MB300 | 1 
________________________________________________________________________ 
CIS177 | Maths   | Mon  | 15:00:00 | MB100 | 6 
________________________________________________________________________ 
CIS188 | Info Syst  | Thu  | 14:00:00 | MB230 | 5 
________________________________________________________________________ 
CIS199 | Intro to Java | Fri  | 10:00:00 | MB300 | 4 
________________________________________________________________________ 
CIS277 | Algorithmics | Thu  | 14:00:00 | MB200 | 2 
________________________________________________________________________ 
CIS288 | Database Syst | Mon  | 14:00:00 | MB142 | 1 
________________________________________________________________________ 
CIS297 | Web Design | Mon  | 16:00:00 | MB109 | 3 
________________________________________________________________________ 
CIS298 | C++   | Fri  | 10:00:00 | MB110 | 8 

導師:

tid | tname 
_____________________ 
1 | Rob Hoffman 
_____________________ 
2 | James Butler 
_____________________ 
3 | Kathy Bond 
_____________________ 
4 | Theodora Stewart 
_____________________ 
5 | Mike Richie 
_____________________ 
6 | John Kay 
_____________________ 
7 | Mary Tregear 
_____________________ 
8 | Mark Robinson 

已登記:

sid | ccode 
______________ 
211 | CIS288 
203 | CIS298 
214 | CIS297 
105 | CIS177 
215 | CIS297 
104 | CIS188 
210 | CIS297 
338 | CIS320 
102 | CIS177 
338 | CIS399 
204 | CIS288 
204 | CIS277 
102 | CIS199 
203 | CIS297 
105 | CIS199 
331 | CIS320 
202 | CIS299 
205 | CIS299 
210 | CIS298 
331 | CIS399 
321 | CIS399 
210 | CIS288 
210 | CIS277 
204 | CIS297 
321 | CIS320 
328 | CIS388 
327 | CIS388 
211 | CIS297 
333 | CIS399 
215 | CIS288 
104 | CIS199 

學生:

sid | sname  | programme | level | age 
____________________________________________ 
101 | Lorry Ross | CS   | 1  | 18 
102 | Lydia Ken | CIS  | 1  | 18 
103 | Bob Chung | CS   | 1  | 18 
104 | Sonia Morris | CIS  | 1  | 18 
105 | Mark Poppy | CS   | 1  | 19 
106 | Megan Chi | IT   | 1  | 20 
218 | Diana McDon | IT   | 2  | 20 
219 | Nick Smith | IT   | 2  | 21 
+0

請向我們展示表結構(帶有足以用於查詢的字段)。現在,您的查詢的兩個部分沒有鏈接的字段,並且很難建議它們存在的位置。 – Minras 2011-12-19 15:14:49

回答

2

沒有看到您的模式,這是一種猜測,但應該指向你在正確的方向:

select s.sid, s.sname, e.ccode 
from student s 
inner join enrolled e on s.sid = e.sid 
inner join class c on e.ccode = c.ccode --may be incorrect 
inner join tutor t on c.tid = t.tid 
where s.programme = 'IT' 
    and t.tname = 'Hoffman' 
+0

再次顯示選定的列標題,但沒有結果? – 2011-12-20 14:55:54

+0

這並不奇怪,因爲沒有家教名爲「霍夫曼的示例數據。 – 2011-12-20 15:04:23

+0

..... OH。哈哈哎呀,愚蠢的錯誤,謝謝。 – 2011-12-20 15:17:45

1

您的查詢不起作用,因爲沒有在exists塊與頂級SELECT語句表達的關係。你需要找到一種方法,涉及的tutorclass表回studentenrolled表。換句話說,你應該能夠使用僅僅inner joins 4個表和相應的where子句之間來表達你的整個查詢。

2

我會工作從什麼紅提供反向查詢......你知道的導師,並鑽入了那個人的學生......如果一個導師與相關的說... 3班,爲什麼查詢表可能有10,000名學生

select 
     s.id, 
     s.sname, 
     e.eccode 
    from 
     tutor t 
     join class c 
      on t.tid = c.tid 
      join enrolled e 
       on c.ccode = e.ccode 
       join students s 
        on e.sid = s.sid 
       and s.programme = 'IT' 
    where 
     t.tname = 'Hoffman' 
+0

這會顯示選定的列標題,但沒有結果。 – 2011-12-20 14:45:35

+0

我會假設,查詢規劃將採取的實際表考慮到自身,並會自行決定訪問順序的表。對於這個例子,RedFilter的方式和你的方式應該沒有區別。 – 2011-12-20 15:15:46