2011-10-12 4 views
0

나는 다음과 같은 방식으로 내 데이터베이스를 조회하기 위해 노력하고있어 :쉬운 SQL 플러스 쿼리 (그룹화)

이름, 주요 찾기 및 중 하나 수학 전공 또는에 등록되어 최연소 학생의 연령 컴퓨터 과학에 속한 교수가 가르치는 코스. 제대로 학생을 발견하는

STUDENT(*snum: integer, sname: string, major: string, slevel: string, age: integer) 
CLASS(*name: string, meets_at: date, room: string, fid: integer) 
ENROLLED(*snum:integer, *cname: string) 
FACULTY(*fid: integer, fname: string, deptid: integer) 
DEPARTMENT (*deptid: integer,dname: string, Location:string) 

(The fields with '*' are primary keys.) 

가 나는 다음과 같은 쿼리를 작성했습니다,하지만 난 이름과 전공을 인쇄하는 방법을 알아낼 수 없습니다 다음과 같이

스키마입니다.

SELECT MIN(s.age) 
FROM student s 
WHERE (s.major = 'Math') 
     OR s.snum IN (SELECT e.snum 
         FROM class c, 
          enrolled e, 
          faculty f, 
          department d 
         WHERE e.cname = c.NAME 
          AND c.fid = f.fid 
          AND d.dname = 'Computer Sciences'); 

나는 다음과 같은 시도와 오류가 발생했습니다 : "하지 단일 그룹의 그룹 기능"

SELECT s.sname, 
     s.major, 
     MIN(s.age) 
FROM student s 
WHERE (s.major = 'Math') 
     OR s.snum IN (SELECT e.snum 
         FROM class c, 
          enrolled e, 
          faculty f, 
          department d 
         WHERE e.cname = c.NAME 
          AND c.fid = f.fid 
          AND d.dname = 'Computer Sciences'); 

어떤 아이디어? SQLPlus에 익숙하지 않으므로 쿼리를 작성하는 방법을 배우려고합니다. 미리 감사드립니다.

답변

2

쉬운 방법 : 당신이 뭔가 더 우아하고 싶다면 좀 더 그것으로 생각 약간을 넣어 것,

SELECT * 
FROM 
student where age = 
(
SELECT MIN(s.age) 
FROM student s 
WHERE (s.major = 'Math') 
     OR s.snum IN (SELECT e.snum 
         FROM class c, 
          enrolled e, 
          faculty f, 
          department d 
         WHERE e.cname = c.NAME 
          AND c.fid = f.fid 
          AND d.dname = 'Computer Sciences')) 

: 당신이 하위 쿼리로 작업 한 쿼리를 확인합니다.

그 나이에 여러 명의 학생이있는 경우 둘 이상의 행이 표시 될 수 있습니다.

+0

완벽, 감사합니다! 하위 쿼리에 대해 좀 더 자세히 읽으겠습니다. 그 이유는 많은 작업을 수행 할 필요가 없었기 때문입니다. 고맙습니다! – Jon

1

GROUP BY 절을 추가해야합니다.

이 시도 :

SELECT s.sname, 
     s.major, 
     MIN(s.age) 
FROM student s 
WHERE (s.major = 'Math') 
     OR s.snum IN (SELECT e.snum 
         FROM class c, 
          enrolled e, 
          faculty f, 
          department d 
         WHERE e.cname = c.NAME 
          AND c.fid = f.fid 
          AND d.dname = 'Computer Sciences') 
GROUP BY s.sname,s.major; 

또한, 당신은 그룹화 된 정보에 조건을 적용 할 수있는 옵션 HAVING 절있다. 예를 들어 같은 결과를 원했지만 25 세 이상의 사람들에게만 쓰려면 SELECT s.sname, s.major, MIN (s.age) FROM student WHERE (s .major = '수학') OR IN s.snum은 (C 클래스 을 e.snum SELECT, 는 E, F 교수, 부서 등록 D WHERE e.cname = c.NAME AND c.fid = F .fid AND d.dname = '컴퓨터 과학') GROUP BY s.sname, s.major HAVING MIN (s.age)> = 25;

WHERE 절에 MIN(s.age)을 넣는 것은 작동하지 않습니다. HAVING 절은 그룹화 된 정보에 술어를 적용하는 방법입니다. 도움이

희망,

마가 복음