我正在使用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;
答案 0 :(得分:2)
如果您拥有Oracle 12c,这是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
将找到比tabelb
晚的returndate
条记录,按inspectdate
进行排序并给您仅第一个。
与IT Alex的回答相比,它的优势在于它的工作不受a.vehicleid
的限制。也就是说,您可以一次在许多车辆上运行它(例如,在报告或摘要屏幕中)。
答案 1 :(得分:1)
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;
获取超过返回日期的检查日期,然后从最旧到最新进行排序。第一行是退货后第一次检查的日期。