在MS access 2016中等效命令OUTER APPLY

时间:2017-02-03 17:37:17

标签: sql database ms-access-2016

为了获取新信息,我尝试与表关联,但似乎MS访问中没有OUTER APPLY。这是我的代码:

    SELECT *
FROM [pred-predi_calculo-presi]
  OUTER APPLY
    ( SELECT TOP 1 [snptc_histo].POSICIONBUS
      FROM [snptc_histo]
      WHERE [snptc_histo].PATENTEBUS = [pred-predi_calculo-presi].PATENTE
        AND [snptc_histo].horaConsulta < [pred-predi_calculo-presi].'pasadaReal'
      ORDER BY [snptc_histo].horaConsulta DESC
    ) AS p
  OUTER APPLY
    ( SELECT TOP 1 [snptc_histo].POSICIONBUS
      FROM [snptc_histo]
      WHERE [snptc_histo].PATENTEBUS = [pred-predi_calculo-presi].PATENTE
        AND [snptc_histo].horaConsulta >= [pred-predi_calculo-presi].'pasadaReal'
      ORDER BY [snptc_histo].horaConsulta ASC
    ) AS n ;

任何帮助都会受到欢迎

编辑:我认为使用java代码执行此操作会更容易(我有算法)并且更加优化,但我没有合适的工具比如数据结构或权利&#34;命令&#34;使用数据库抛出java(我是数学家)所以要在java中这样做我需要更多的帮助。虽然我对此解决方案的评论持开放态度。 这是一个示例数据:

预解码值-predi_calculo-PRESI:

Id1 ID                       Paradero'horaPrediccion''pasadaReal'PREDICCION_NUEVA   PATENTE servicio
1   2016-12-13 11:36:50_T518    PA52    11:36:51       11:36:20      1579,242       CJRW-73    518
2   2016-12-13 11:36:50_T518    PA52    11:36:51       11:36:20      761,211        BJFB-79    518
3   2016-12-13 12:11:02_T518    PC475   12:17:53       12:16:34      1382,545       BFKC-47    518
4   2016-12-13 12:11:02_T518    PC475   12:17:53       12:16:34      695,283        CJRW-74    518
5   2016-12-13 12:11:03_T418    PC206   12:16:27       12:15:50      1210,033       ZN-6742    418
6   2016-12-13 12:11:03_T418    PC206   12:16:27       12:15:50      1407,741       ZN-5814    418
7   2016-12-13 13:16:41_T516    PD208   13:17:56       13:18:02      842,634        BJFY-17    516

snptc_histo:

PATENTEBUS  POSICIONBUS horaConsulta
WA-9114     0           17:15:52
CJRW-83     3,64        17:15:52
ZN-3967     0,26        17:15:50
BJFV-89     11,06       17:15:51
BJFS-92     32,866      17:15:51
FLXJ-30     19,74       17:15:51
BJFR-52     9,55        17:15:50
CJRW-52     24,67       17:15:50
BJFR-94     14,75       17:15:49
CJRT-63     16,02       17:15:49

1 个答案:

答案 0 :(得分:1)

在Access中不是最简单的事情,但请尝试以下操作。

Query1 - 查找每个PATENTEBUS值的最大horaConsulta值小于pasadaReal的中间查询:

SELECT s.PATENTEBUS, MAX(horaConsulta) AS MaxHoraConsulta
FROM [snptc_histo] AS s 
INNER JOIN [pred-predi_calculo-presi] AS p ON s.PATENTEBUS = p.PATENTE
WHERE s.horaConsulta < p.pasadaReal
GROUP BY s.PATENTEBUS

Query2 - 使用Query1查找关联的POSICIONBUS值:

SELECT s.PATENTEBUS, s.POSICIONBUS
FROM [snptc_histo] AS s 
INNER JOIN Query1 AS q ON s.PATENTEBUS = q.PATENTEBUS AND s.horaConsulta = q.MaxHoraConsulta

现在创建类似的查询,以便为每个PATENTEBUS值及其关联的POSICIONBUS值找到大于或等于pasadaReal的min horaConsulta值:

QUERY3

SELECT s.PATENTEBUS, MIN(horaConsulta) AS MinHoraConsulta
FROM [snptc_histo] AS s 
INNER JOIN [pred-predi_calculo-presi] AS p ON s.PATENTEBUS = p.PATENTE
WHERE s.horaConsulta >= p.pasadaReal
GROUP BY s.PATENTEBUS

Query4

SELECT s.PATENTEBUS, s.POSICIONBUS
FROM [snptc_histo] AS s 
INNER JOIN Query3 AS q ON s.PATENTEBUS = q.PATENTEBUS AND s.horaConsulta = q.MinHoraConsulta

现在您的最终查询变为:

SELECT p.*, q2.POSICIONBUS, q4.POSICIONBUS
FROM ([pred-predi_calculo-presi] AS p
LEFT JOIN Query2 AS q2 ON p.PATENTE = q2.PATENTEBUS)
LEFT JOIN Query4 AS q4 ON p.PATENTE = q4.PATENTEBUS