带子查询的简单SQL问题

时间:2011-09-06 00:07:00

标签: sql

我正在使用在线斯坦福数据库课程练习刷新我的SQL,找到here。这是问题所在:

  

“查找只有朋友的学生的姓名和成绩   年级。返回按成绩排序的结果,然后按名称排列   级“。

我们有一个highschooler表,其中包含namegradeid属性。此外,likes表包含属性id1id2id1中的id2likesid中的highschooler相对应。

根据问题部分来源,我可以说我需要使用子查询,但我不知道在哪里。我该如何处理这个问题?目前建议的解决方案都不起作用。

这是我当前的SQL语句,它无法正常工作(忽略排序):

select distinct 
  student1.id, 
  student1.name, 
  student1.grade 
from 
  highschooler student1, 
  highschooler student2, 
  friend 
where not exists (select * 
                  from friend 
                  where student1.id = id1 
                    and student2.id = id2 
                    and student1.grade = student2.grade 
                    and student1.id <> student2.id);

2 个答案:

答案 0 :(得分:0)

我认为,如果A是B的朋友,则等于B是A的朋友。

CREATE VIEW Temp
AS
    SELECT id,name,grade,id2,[grd2] FROM highschooler 
        INNER JOIN Likes ON highschooler.id = Likes.id1         
        INNER JOIN (SELECT id as [id2t], grade as [grd2] from highschooler) a ON a.id2t = Likes.id2             
    UNION ALL 
    SELECT id,name,grade,[id1] as [id2],[grd2] FROM highschooler 
        INNER JOIN Likes ON highschooler.id = Likes.id2         
        INNER JOIN (SELECT id as [id2t], grade as [grd2] from highschooler) a ON a.id2t = Likes.id1     

temp 视图让我拥有了我需要的所有信息。

CREATE VIEW PlayWithClassMate 
AS 
    SELECT distinct id FROM Temp WHERE grade = grd2

这个 PlayWithClassMate 视图让我让所有与她/他的同学一起玩的学生(有些人,我认为一个人可以玩,他/她的朋友不是他们的同学)。

CREATE VIEW IDResult 
AS 
    SELECT id FROM (
        SELECT id, COUNT(GRD2) as c FROM TEMP 
            WHERE id in (SELECT id FROM PlayWithClassMate)
            GROUP BY ID) A
    WHERE C>1

IDResult 视图包含问题的所有ID。 现在,选择您需要的任何内容,其ID IDResult

我认为这不是最好的,或者可能是最糟糕的,但它确实有效。 (srr abt terribe语法)

答案 1 :(得分:-1)

这比它看起来更难,因为它需要按顺序准备套装。但是,有几种方法可以解决这个问题。以下是我们想到的:

首先,按年级分别为每个人找到朋友的朋友:

[ID],[FoF ID],[FoF等级]

您确实不需要[FoF ID],但在调试时可能会有所帮助。

然后,作为二阶运算,你需要产生一个[ID]列表,其中[FoF等级]等于MAX()和MIN():

SELECT [ID],MAX(FoF等级)为A,MIN(FoF等级)为B FROM [上述] WHERE A = B

<强>更新: 我意识到我还应该在最后的qry中添加:A = B和A = Grade。然后这个解决方案有效请记住:它只回答“查找只有同一年级朋友的学生的姓名和成绩”的问题。它假设友谊是单向的。 (对不起,我不得不放弃一些东西。)

对于那些需要查看SQL的人,请点击此处。它是为MS Access编写的,但很容易移植(通过删除最内层查询中的“()”开始)到MySQL,PGSQL或Oracle。更好的是,没有程序扩展和临时表。

选择 名称 从 ( 选择 ID ,名称 ,年级 ,min(friend_grade)为min_friend_grade ,max(friend_grade)为max_friend_grade 从 ( 选择 hs1.ID ,hs1.name ,hs1.grade ,l.ID2为friend_id ,hs2.name为friend_name ,hs2.grade为friend_grade

这 (highschooler hs1 INNER JOIN喜欢l ON(hs1.ID = l.ID1)) INNER JOIN highschooler hs2 ON(l.ID2 = hs2.ID)

)导电泡棉

GROUP BY ID ,名称 ,等级

)FoF_max_min

WHERE 级= min_friend_grade AND min_friend_grade = max_friend_grade