2015-02-05 3 views
3

데이터 테이블은 다음SQL 중첩 된 쿼리에서 동일한 테이블을 비교

Name cgpa dept 
a  4.0 x 
b  3.9 x 
c  3.8 x 
d  3.8 y 
e  4.0 y 
f  3.9 z 
g  3.6 z 

선택 이름과 CGPA 같은 부서의 모든 다른 학생들보다 높은 학생들의 CGPA 경우 :

select NAME, CGPA 
from STD_INFO T1 
where CGPA > all 
(
select CGPA 
from STD_INFO T2 
where lower(T2.DEPT)=lower(T1.DEPT) 
and T2.STD_NO != T1.STD_NO 
); 

전체 시뮬레이션을 이해해야 ..... ..... 이걸 도와주세요 ... 그리고 위와 같은 테이블 명명법 (T1, t2)을 비교할 때 무엇이 ​​불려지나요 ??

+0

mysql –

+0

두 명의 학생이 동일한 평점을 갖고 있고 둘 다 최고 인 경우이 방법은 작동하지 않습니다. 어떤 이름으로 보여줄 수 있습니까? – LCIII

+0

실제로 나는 SQL에 익숙하지 않습니다 .... 시뮬레이션을 이해하기 위해 인터넷을 탐색했지만 운이 없다면 ..... 여기에서 무슨 일이 일어나고 있는지 자세히 설명해주십시오 .....나는 시뮬레이션을 의미합니다 –

답변

0

당신은 데이터가 STD_INFO 테이블로 설정하는 DEPTmax(CGPA)inner join를 찾으려면 : 당신이 T1 전화 테이블 std_info의 모든 레코드를 통해

select s1.NAME,s1.CGPA 
from STD_INFO as s1 
    inner join (select DEPT,max(CGPA) as CGPA 
       from STD_INFO 
       group by DEPT) as s2 
    on s2.DEPT = s1.DEPT 
    and s2.CGPA = s1.CGPA; 

SQL FIDDLE

+0

이것은 부서에 최대 cgpa를 가진 학생이 둘 이상인 경우 원래 쿼리와 다른 결과를 나타냅니다. (LCIII의 정교한 답변에 대한 내 의견을 참조하십시오.) –

0

당신 루프를. 각 레코드에 대해 cgpa가 하위 쿼리에서 선택한 모든 cgpas보다 큰지 확인합니다.

하위 쿼리에서 이번에 t2를 호출하는 std_info 테이블에서 다시 선택합니다. 따라서 하나의 t1 레코드는 같은 부서 (lower(T2.DEPT)=lower(T1.DEPT))이지만 다른 학생 번호 (T2.STD_NO != T1.STD_NO)가있는 테이블의 모든 레코드를 선택합니다.

학과의 다른 모든 학생이 현재보고있는 학생보다 낮은 cgpa 인 경우, 학생을 결과 목록에 보관합니다. 그렇지 않으면 학생을 결과 목록에서 삭제합니다.

그래서 모든 학생을 체크 한 후에 같은 부서의 다른 모든 학생보다 cgpa가 높은 사람들과 함께 남아 있습니다.

내가 생각할 수있는 "이름"은 다음과 같습니다. 이것은 동일한 테이블에 상관 된 하위 쿼리입니다.

> ALL (또는 SOME 또는 ANY)의 사용은 매우 드뭅니다.

select NAME, CGPA 
from STD_INFO T1 
where not exists 
(
    select * 
    from STD_INFO T2 
    where lower(T2.DEPT)=lower(T1.DEPT) 
    and T2.STD_NO != T1.STD_NO 
    and T2.CGPA >= T1.CGPA 
); 
+0

감사합니다 .... 명확하고 멋진 –

0

선택 이름과 CGPA 같은 부서의 모든 다른 학생들보다 높은 학생들의 CGPA : 대부분의 경우 당신은 존재하거나 대신에 사용

두 학생이 같은 경우 GPA를 사용하면 두 레코드를 모두 보여 주어야합니다. 그렇지 않으면 시스템은 두 부서 모두 "최상위"이므로 표시 할 이름을 알 수 없습니다. 이 예에서와 같이 :

Name cgpa dept 
a  4.0 x 
b  4.0 x 
r  3.1 x 
c  3.8 y 
e  3.5 y 
d  3.9 z 

이 쿼리는 :

SELECT t.* FROM table AS t 
INNER JOIN (
SELECT MAX(cgpa) AS 'cgpa',dept FROM table AS t2 
GROUP BY dept) AS innerTable 
ON innerTable.cgpa = t.cgpa AND innerTable.dept = t.dept 

이를 반환합니다

Name cgpa dept 
a 4 x 
b 4 x 
c 3.8 y 
d 3.9 z 

여기에 대한 대답은 이것과 매우 유사합니다 : 내가 사용하고 How do you group by one column and retrieve a row with the minimum value of another column in T/SQL?

+0

글쎄, 두 명 이상의 학생이 최대 cgpa를 갖고 있다면 "cgpa는 같은 부서의 다른 모든 학생보다 높습니다."단순히 그 (것)들을 위해 진실하지 않으며 원래 질문으로 보이지 않고있다. 거기에 아무런 문제가 없습니다. 당신은 자신의 부서에서 cgpa가 최대 인 모든 학생들을 보여주는 약간 다른 쿼리를 보여줍니다. –

관련 문제