В моем приложении есть таблица, которая содержит данные инвентаризации снимков за каждый год. Например, есть таблица инвентаризации транспортных средств с типичными столбцами vehicle_id, vehicle_plate_num, vehicle_year, vehicle_make и т. Д., А также год, обозначающий, что транспортное средство принадлежит.
Запрос всей таблицы может привести к чему-то вроде этого:
Id Plate Num Year Make Model Color Year Owned
---------------------------------------------------------
1 AAA555 2008 Toyota Camry blue 2009
2 BBB666 2007 Honda Accord black 2009
3 CCC777 1995 Nissan Altima white 2009
4 AAA555 2008 Toyota Camry blue 2010
5 BBB666 2007 Honda Accord black 2010
6 DDD888 2010 Ford Explorer white 2010
(Хорошо это или плохо, эта таблица уже существует, и ее нельзя изменить, и это тема для другого вопроса). То, что вы видите здесь, год за годом, большинство транспортных средств все еще находятся в инвентаре, но всегда есть ситуация, когда от старых избавляются и приобретаются новые транспортные средства. В приведенном выше примере Nissan Altima 1995 года находился в инвентаре 2009 года, но больше не в инвентаре 2010 года. У инвентаря 2010 есть новый Ford Explorer 2010 года.
Как мне создать эффективный запрос, который занимает любые два года и показывает только разницу. Например, если я передам в 2009, 2010, запрос должен вернуть
3 CCC777 1995 Nissan Altima white 2009
Если я укажу в 2010, 2009, запрос должен вернуть
6 DDD888 2010 Ford Explorer white 2010
Edit:
Я должен был добавить комментарий после ответа от Кайла Б., но текстовая область для комментария не очень удобна для пользователя:
Я не думал, что это будет так сложно, но, похоже, это так.
В любом случае, вам не понадобится дополнительный выбор из приведенного выше:
select q.* from (
select f.*
from inventory f
left join inventory s
on (f.plate_num = s.plate_num
and f.year_owned = :first-year
and s.year_owned = :second-year)
where s.plate_num is null
) q
where q.year_owned = :second_year