Список лет без медицины Нобелевской в ​​SQLZoo - PullRequest
2 голосов
/ 14 марта 2020

Нас просят найти годы, когда благородный приз в медицине не давался. Я хотел бы знать, почему один запрос не работает, в то время как другой работает:

Попытка решения:

SELECT DISTINCT yr
  FROM nobel
    WHERE subject <> 'Medicine'

и почему этот запрос, кажется, работает

Рабочий раствор:

SELECT DISTINCT yr
  FROM nobel
    WHERE yr NOT IN (
                     SELECT DISTINCT yr
                         FROM nobel
                         WHERE subject = 'Medicine'
                    )

Ответы [ 2 ]

2 голосов
/ 14 марта 2020

В первом запросе будут выбраны годы всех Нобелевских премий, которые не предназначены для медицины. Так, например, если в определенном году призы были вручены за медицину и физику, вы все равно получите этот год за приз физики. Второй запрос выбирает все годы, которые не являются годами с призом за лекарство, и это то, что вы хотели получить.

1 голос
/ 14 марта 2020

Объяснение существующих запросов Mureinik ясное и правильное (+1).

Я хотел бы отметить, что вы можете получить тот же результат с помощью простого агрегированного запроса и предложения having:

select yr
from nobel
group by yr
having count(*) filter(where subject = 'Medicine') = 0

Агрегирует по годам и фильтрует по тем, у кого не было предмета медицины. Этот запрос сканирует (и группирует) таблицу только один раз.

...