gpt4 book ai didi

SQL查询以显示与同一张表的差异

转载 作者:行者123 更新时间:2023-12-04 23:46:24 24 4
gpt4 key购买 nike

我的应用程序有一个表,其中包含每年的快照库存数据。例如,有一个车辆库存表,其中包含典型的列 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

(无论好坏,该表已经存在并且不能重新设计该表,这是另一个问题的主题)。你在这里看到的是年复一年,大部分车辆还在库存中,但总是出现旧车淘汰,新车收购的情况。在上面的示例中,1995 年的 Nissan Altima 在 2009 年的库存中,但不再在 2010 年的库存中。 2010 库存有一辆新的 2010 Ford Explorer。

我如何构建一个高效的查询,该查询需要任意两年时间并仅显示差异。例如,如果我在 2009 年、2010 年通过,则查询应返回

3   CCC777  1995  Nissan  Altima      white   2009

如果我在 2010 年、2009 年通过,查询应该返回

6   DDD888   2010  Ford   Explorer   white   2010

编辑:我应该在 Kyle B. 的回答之后添加评论,但是评论的文本区域不是很用户友好:

我没想到会这么难,但似乎是。

无论如何,您是否需要像这样从上面进行子选择:

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

最佳答案

你想要一个self-outer join

看起来你想要不对称的差异。如果您想要对称差异,您可以使用完全外部联接而不是左(或右)外部联接。

有变量 :first-year 和 :second-year

select f.*
from inventory f
left join inventory s
on (f.plate_num = s.plate_num
and s.year_owned = :second-year)
where s.plate_num is null
and f.year_owned = :first-year

请注意,条件必须在连接条件内,这样数据库将在没有匹配项时返回空行,而不是找到稍后通过过滤删除的匹配项。

编辑:稍微调整了查询​​。这不需要子选择。使用 postgresql 测试。

关于SQL查询以显示与同一张表的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2312764/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com