2014-12-10 2 views
0

을 복용하는 학생의 이름을 찾고 내 테이블 컴퓨터 과학 과정과 수학 과정을 함께 듣는 학생들의 그러나 어떤 결과도 채워지지 않습니다.이 개 과정 여기

SELECT student.sid, student.sname 
FROM student 
INNER JOIN major ON major.sid = student.sid 
AND major.dname LIKE '%Computer Sciences%' AND '%Mathematics%' 
GROUP BY student.sname, major.dname 

초 시도 "결과가 없습니다 채워/오류없이":

SELECT student.sid, student.sname, course.dname 
FROM student, course 
INNER JOIN major ON major.dname = course.dname 
WHERE course.dname = '%Computer Sciences%' 
AND course.dname = '%Mathematics%' 
오류 메시지

세 번째 시도 : "알 수없는 열

내 첫 시도"결과가 없습니다 채워/오류없이 "

'student.dname'in 'where clause' ":

SELECT student.sid, student.sname 
    FROM student 
    WHERE EXISTS (SELECT * FROM major WHERE major.dname=student.dname LIKE '%Computer Sciences%' AND  '%Mathematics%') 

누군가 올바른 방향으로 나를 가리킬 수 있습니까?

답변

0

더 많은 조인을 사용하고 제공 한 관계를 유추했습니다. 이것은 학생이 각학과의 한 반에있는 학생 이름과 ID를 반환합니다. GROUP BY는 학생들이이학과 중 하나에서 한 과목 이상을들을 경우 중복을 제거하기 위해서만 필요합니다.

SELECT student.sid, student.sname 
FROM student 
JOIN enroll e1 ON e1.sid=student.sid 
JOIN course c1 ON c1.cno=e1.cno 
JOIN enroll e2 ON e2.sid=student.sid 
JOIN course c2 on c2.cno = e2.cno 
WHERE c1.dname LIKE '%Mathematics%' 
AND c2.dname LIKE '%Computer Science%' 
GROUP BY student.sid 
1

특히 우아하지는 않지만 몇 가지 방법이 있습니다. 이것은 수학의 모든 학생의 목록을 가져온 다음 컴퓨터 과학에있는 학생들의 어떤 볼이 목록을 비교

SELECT student.sid, student.sname 
FROM student 
INNER JOIN major ON major.sid = student.sid 
WHERE major.dname = 'Computer Sciences' 
AND student.sid IN (
    SELECT student.sid 
    FROM student 
    INNER JOIN major ON major.sid = student.sid 
    WHERE major.dname = 'Mathematics' 
) 

: 여기 하나의 방법입니다. 당신은 둘 다있는 학생들의 목록으로 끝납니다.

+1

저는 주요 테이블이 붉은 청어라고 생각합니다. 단지 전공을 선택하지 않고학과 과정을 수강하는 학생들을 찾고 있습니다. – RobP

+0

오, 아마 맞을 것입니다. 내 질문은 과정이 아닌 전공에서 효과가 있습니다. 그러나 동일한 교장이 적용됩니다. 코스 전공을 전환하고 적절한 조인을 제자리에 두십시오. –

+0

두 개의 쿼리를 수행하고 IN 연산자를 사용하면 성능이 크게 향상됩니다. 올바른 인덱스가 있으면 더 많은 JOIN을 사용하는 것이 훨씬 빠릅니다 ... 내 대답을 고수 할 것입니다. – RobP

0

당신은 두 개의 조인을 분리 사용할 수에 대한 최초의 의지를 테스트 CS 전공하고, 두 번째는 수학을 테스트합니다

SELECT student.sid, student.sname 
FROM student 
INNER JOIN enroll AS enroll1 
    ON enroll1.sid = student.sid AND enroll1.dname = '%Computer Sciences%' 
INNER JOIN enroll AS enroll2 
    ON enroll2.sid = student.sid AND enroll2.dname = '%Mathematics%' 
GROUP BY student.sname, major.dname 
+0

이것은 부서 이름 ('dname'과 같이) enroll 테이블에 문자열로 포함됩니다. – Edward

0

내가 사용하여이 집계하고 having 절을 할 것입니다. 나는이 사용하는 접근 방식 조인보다 훨씬 더 일반화 찾을 :

SELECT s.sid, s.sname 
FROM student s INNER JOIN 
    major m 
    ON m.sid = s.sid 
GROUP BY s.sname, s.sname 
HAVING SUM(m.dname LIKE '%Computer Sciences%') > 0 AND 
     SUM(m.dname LIKE '%Mathematics%') > 0; 

having 절에 각 조건은 특정 과목을 복용 학생의 수를 계산합니다. > 0에는 적어도 하나는 있다고 나와 있습니다. 세 번째 또는 네 번째 코스 세트를 추가하려는 경우 HAVING 절에 조건을 추가하면 매우 쉽습니다.