2017-02-03 5 views
1

新しい情報を得るためにテーブルに関連付けることを試みましたが、MSアクセスにOUTER APPLYがないようです。ここに私のコードは次のとおりです。MSアクセスでOUTER APPLYの同等のコマンド2016

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コードでこのアクションを実行するためにはるかに簡単だろうと思ったと思います(私は心の中でアルゴリズムを持っている)と、また最適ですが、データ構造や正しい "コマンド"のような適切なツールがないので、javaでこれを行うにはもっと多くの助けが必要です(私は数学者です)。私はこの解決策についてコメントしていますが、

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:

predは-predi_calculo-PRESI: は、ここにサンプルデータです

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

ないアクセスに最も簡単な方法が、以下を試してみてください。

Query1を - 各PATENTEBUS値についてpasadaReal未満の最大horaConsulta値を見つけるために、中間の問合せ:

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 - 関連するPOSICIONBUS値を見つけるために、Query1をを使用します。

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以上の最小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 
+0

Query1をは動作しません。 「WHERE s.horaConsulta

+0

に作用します。元の投稿には[[pred-predi_calculo-presi]。 'pasadaReal''とは何ですか?私はこれが '[pred-predi_calculo-presi]。[pasadaReal]'と書かれていたはずだと仮定しました。つまり、 'pasadaReal'は' [pred-predi_calculo-presi] 'テーブルの列であると仮定しました。これは間違っていますか? – Skippy

+0

しかし、私が言ったように、WHEREはSELECTに作用するので、書き込み中の行に[snptc_histo]列が表示され、他のテーブルの列ではないため、参照する行がわからないため –

関連する問題