2014-04-14 5 views
1

그래서 대화 형 튜토리얼을 해결하고 있습니다 http://www.sqlzoo.net/wiki/SELECT_from_Nobel_Tutorial 그러나 보너스 부분에는 해결책이 없습니다.중첩 된 서브 쿼리가 잘못 되었습니까?

다음은 질문입니다. 년 동안 물리학 상을 받았지만 화학상은 없었습니다. 튜토리얼이 대답은 내 솔루션은

편집 잘못 왜 이해가 안

1933 
1924 
1919 
1917 

입니다 말했을 때

SELECT yr FROM nobel 
WHERE subject = 'Physics' AND yr NOT IN 
(SELECT yr FROM nobel WHERE subject = 'Literature') 

내가 출력

1943 
1935 
1918 
1914 

을 가지고 : 나는 보았다 '문학'은 '화학'이어야하지만 아직도 유효하지 않은 부주의 한 실수

+2

아마도 '문학'을 '화학'으로 변경해야 할 것입니다. –

+0

omg 어떻게이 질문을 닫으시겠습니까 – latenightcode

+0

@CodeCrusader '문학'을 '화학'으로 대체하는 것만으로는 정확한 결과를 얻지 못합니다. 물리학 상을 여러 명의 수상자에게 수여 할 때 몇 년 후에 나타납니다. . – dasblinkenlight

답변

1

쿼리에 두 가지 오류가 있습니다

당신은 잘못 입력
  • Chemistry이 (쿼리가 Literature을 말한다 내가 nstead)
  • 당신은 distinct 결과
  • 여기

을 요청하지 않은 수정 된 쿼리입니다 : 1933 년 물리학 상 여러 수상자에게 수여되어 있기 때문에

SELECT DISTINCT yr 
FROM nobel 
WHERE subject = 'Physics' AND yr NOT IN 
(SELECT yr FROM nobel WHERE subject = 'Chemistry') 

DISTINCT가 중요하다 - 즉은, Dirac과 Schrödinger. 테이블의이 두 행은 출력에서 ​​1933에 대한 두 개의 항목을 가져 오며 원하지 않습니다.

1

물리학상은 수여되었지만 화학상은 수여되지 않았습니다.

다시 당신의 작업 ...

대상 = '물리'를 읽고 하지 예멘 아랍 공화국 :) (노벨 FROM 년을 선택 WHERE 대상 = '문학')

1

질문에 "경고"가 올바르지 않습니다. 당신은 group byhaving 절을 사용하여이 작업을 수행 할 수 있습니다

select n.yr 
from nobel n 
group by n.yr 
having sum(n.subject = 'Physics') > 0 and 
     sum(n.subject = 'Chemistry') = 0; 

나는이 시점에서, 튜토리얼은 group by, having를 도입하지 않았 음을 추측, 또는 정수로 부울 결과를 사용하고 있습니다. 그러나이 작업을 수행하려면 join 또는 부속 조회가 필요하지 않습니다.

1
SELECT DISTINCT x.yr 
    FROM nobel x 
    LEFT 
    JOIN nobel y 
    ON y.yr = x.yr 
    AND y.subject = 'chemistry' 
WHERE x.subject = 'physics' 
    AND y.yr IS NULL; 
관련 문제