我正在使用Oracle SQL,并遇到了一个问题。
我有一张桌子TableA,在那里我可以得到一辆车的退货日期。
我有另一张桌子TableB,在那里我可以得到车辆的检验日期。该表有一个名为id的列,其中id =2表示对车辆进行了检查。这辆车有可能经过多次检查。
有可能在返回日期之后获得第一次检验日期吗?
它尝试了类似于下面的方法,但它似乎是遥不可及。有什么想法吗?
select a.returndate, b.time as inspectdate
from tabel a
join tabelb b on a.vehicleid = b.vehicleid where b.id = 93
where a.vehicle= 011 and min(b.time) > a.returndate;发布于 2018-10-15 15:27:11
如果您有Oracle12c,这是CROSS APPLY的一个很好的用例:
select a.returndate, b.inspectdate
from tabela a
CROSS APPLY ( SELECT * FROM tabelb b
WHERE b.vehicleid = a.vehicleid
AND b.inspectdate > a.returndate
ORDER BY b.inspectdate
FETCH FIRST 1 ROW ONLY ) b
where a.vehicleid = 011对于tabela中的每一行,CROSS APPLY将查找比returndate晚的tabelb记录,按inspectdate对它们进行排序,并只为您提供第一个记录。
这比IT亚历克斯的回答更有优势,因为它在a.vehicleid上没有限制。也就是说,您可以同时为许多车辆运行它(例如,在报告或摘要屏幕中)。
发布于 2018-10-15 15:20:47
select a.returndate, b.inspectdate
from tabel a
join tabelb b on a.vehicleid = b.vehicleid
where a.vehicle= 011
and b.inspectdate > a.returndate
and b.id = 93
order by b.inspectdate asc;抓取超过退货日期的检查日期,然后从最老到最新订购。第一行将是返回后第一次检查的日期。
https://stackoverflow.com/questions/52819776
复制相似问题