2011-12-19 77 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