2011-05-12 2 views
0

레일즈에서 루비에서 다음과 같은 작업을하려고하지만, mysql에서 좋은 답변을 얻을 수 있다고하더라도.관련 테이블의 열 중 하나가 조건을 충족시키지 못하면 테이블에서 행을 무시할 수 있습니까?

나는 학생과 코스 테이블이 있습니다. 학생 -> 코스는 일대 다 관계입니다. 나는 하나의 SQL을 사용하여 동일한 결과를 달성하고자하는

 
    Student     Course 
|--------------| |--------------------------------------| 
|id| name  | |id | course_name | grade | student_id | 
|---------- | |--------------------------------------| 
|S1| student 1 | |C1 | Course1  | A  | S1   | 
|S2| student 2 | |C2 | Course2  | C  | S1   | 
|---------- | |C3 | Course1  | A  | S2   | 
        |C4 | Course2  | B  | S2   | 
        |--------------------------------------| 
select * from Student 
where id NOT IN (select student_id from Course where grade = 'C') 

문 또는 액티브를 사용하여 가입하세요.

답변

1
SELECT * FROM Student s 
LEFT JOIN Course c ON s.id=c.student_id AND c.grade = 'C' 
WHERE c.student_id IS NULL; 

아니면 하위 쿼리

SELECT * FROM Student s 
LEFT JOIN (SELECT student_id FROM Course WHERE grade = 'C') c 
WHERE c.student_id IS NULL; 

또는 사용에 조인

SELECT * FROM Student s 
WHERE NOT EXISTS (SELECT NULL FROM Course WHERE grade = 'C' AND student_id=s.id); 

이 나는 ​​순간에이를 테스트 할 수 없습니다 두려워 존재하고 나는 이러한 쿼리가 의심을 너를 도울 수는 없어. ActiveRecord에 대한 경험이 없습니다. 의견에서 알려주십시오.

+0

첫 번째 SQL 문을했다. 나는 왜 당신이 어디에서 'IS NULL'을 사용했는지 이해할 수 없다. 그것에 대해 자세히 설명해 주시겠습니까? – chetu

+0

@chetu : LEFT JOIN은 오른쪽 테이블 (Course)에 해당 행이 없더라도 왼쪽 테이블 (Student)의 모든 행이 결과에 표시되도록합니다. 오른쪽 열은 "실제"데이터가 없으면 NULL입니다. 이 쿼리에서 학생들은 우리가 원하는 학생들입니다. 학년 = 'C'로 필터링하면 코스 테이블에 표시되지 않은 학생들입니다. –

+0

감사합니다, 코위! – chetu

0

오라클 :

select distinct s.* from student s left join course c on c.student_id=s.id where c.grade!='c' 


Student.all(:select=>"distinct student.*",:joins=>"left join course on course.student_id=student.id",:conditions=>"course.grade!='c'") 
+0

작동하지 않았습니다. – chetu

관련 문제