2012-10-31 86 views
1

我有一張名爲nobel的表,包含以下字段:年,主題和獲勝者。Noob關注:T-SQL嵌套子查詢

此表代表多年來各種科目的諾貝爾獎獲得者的獲獎者。

我正在尋找物理獎獲獎的年份,但沒有獲得化學獎。

我想答案應該看起來像下面這樣:

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

我相當肯定我有語法錯誤......而我不能確定我要下去了正確的道路。幫助將不勝感激。謝謝!

回答

3

試試這個:

SELECT yr 
FROM nobel n1 
WHERE n1.subject = 'Physics' 
AND yr NOT IN (SELECT yr FROM nobel WHERE subject = 'Chemistry') 
+0

對於我正在做的演習,我最終不得不添加DISTINCT年,但您的答案是一路領先!謝謝你,先生! – MonuMan5

+0

如果您使用我的EXCEPT版本,則不需要DISTINCT – RichardTheKiwi

+0

我正在對sqlzoo進行演練。他們必須使用老版本的sql server作爲他們的演習的基礎......因爲它不起作用。但這是一個很酷的方式,我不得不記住。 – MonuMan5

0

我想你可能會走錯路。你所擁有的where子句基本上是在說'化學'='物理學'這永遠不會是真的。

我認爲你需要做的是找出什麼年份物理和化學被授予,然後找到只有物理學被授予的年。

SELECT yr 
FROM Nobel 
LEFT JOIN 
(
    SELECT SUM(1), yr 
    FROM Nobel 
    WHERE subject = 'Chemistry' 
    Group By yr 
) as Chemistry 
ON Chemistry.yr = Nobel.Yr 
LEFT JOIN 
(
    SELECT SUM(1), yr 
    FROM Nobel 
    WHERE subject = 'Physics' 
    Group By yr 
) as Physics 
ON Physics.yr = Nobel.yr 

WHERE Physics.YR IS NOT NULL AND Chemistry.Yr IS NULL 

GROUP BY yr 
0

我們可以做兩個派生表和加入他們的行列。

SELECT c.Year FROM 
c (SELECT Year, COUNT(*) FROM nobel where subject = 'chem' GROUP By Year) INNER JOIN 
p (SELECT Year, COUNT(*) FROM nobel where subject = 'phy' GROUP By Year) ON c.Year = p.Year 
WHERE c.Count != 0 and p.Count = 0 
1

除非你使用SQL Server 2000,EXCEPT作品上2005+。

SELECT yr 
     FROM nobel 
    WHERE subject = 'Chemistry' 
EXCEPT 
    SELECT yr 
     FROM nobel 
    WHERE subject = 'Physics' 
1

下面的代碼會給你需要的結果。

SELECT n1.yr 
    FROM nobel n1 
    WHERE subject = 'physics' 
     AND NOT EXISTS (
      SELECT yr 
      FROM nobel n2 
      WHERE subject = 'chemistry' AND n2.yr = n1.yr 
      )