В приведенном ниже примере я хочу отображать данные только для 1904 игроков, у которых есть запись 1903 года. Что бы я добавил к SQL для этого?
SELECT *
FROM pitchers
WHERE year = 1904
+------+-----------+-----------+-----+-----+
| year | playerID | nameLast | IP | ER |
+------+-----------+-----------+-----+-----+
| 1903 | mathech01 | Mathewson | 366 | 92 |
| 1903 | youngcy01 | Young | 341 | 79 |
| 1904 | mathech01 | Mathewson | 367 | 83 |
| 1904 | walshed01 | Walsh | 110 | 32 |
| 1904 | youngcy01 | Young | 380 | 83 |
+------+-----------+-----------+-----+-----+
Используя приведенный выше пример таблицы, я только хочу собрать данные 1904 года для Мэтьюсона и Янга и не включать Уолша (так как у него не было записи 1903 года).
Вы можете использовать exists
:
SELECT p.*
FROM pitchers p
WHERE p.year = 1904 and
EXISTS (SELECT 1 FROM pitchers p2 WHERE p2.playerID = p.playerID and p2.year = 1903);
Этот запрос позволит вам изменить год только в одном месте. Он принимает бизнес-правило, в котором у вас будет только одна строка за (playerID, год):
SELECT thisyear.*
FROM pitchers AS thisyear
INNER JOIN pitchers AS lastyear
ON lastyear.'playerID' = thisyear.'playerID'
AND lastyear.year + 1 = thisyear.year
WHERE thisyear.year = 1904