サブクエリが外部クエリの列を参照しているときに、PostgreSQLのビューをOracleに変換する際に問題があります。サブクエリの「無効な識別子」
この問題は何度かここで議論されているようですが、特定のクエリで動作する修正プログラムを入手できませんでした。
クエリの目的は、モバイルデバイスが最後に記録された位置を取得し、最も近いチェックポイント/ジオバンダーからKM単位で距離を取得し、3つの別個のテーブル:デバイス、デバイス位置、およびチェックポイントを参照することです。
SELECT
d.id,
dl.latitude AS last_latitude,
dl.longitude AS last_longitude,
(SELECT * /* Get closest 'checkpoint' to the last device position by calculating the Great-circle distance */
FROM (
SELECT
6371 * acos(cos(dl.latitude/(180/acos(-1))) * cos(checkpoints.latitude/(180/acos(-1))) * cos((checkpoints.longitude/(180/acos(-1))) - (dl.longitude/(180/acos(-1)))) + sin(dl.latitude/(180/acos(-1))) * sin(checkpoints.latitude/(180/acos(-1)))) AS distance
FROM checkpoints
ORDER BY distance)
WHERE ROWNUM = 1) AS distance_to_checkpoint
FROM devices d
LEFT JOIN (/* Get the last position of the device */
SELECT l.id,
l.time,
l.latitude,
l.longitude,
l.accuracy
FROM device_locations l
WHERE l.ROWID IN (SELECT MAX(ROWID) FROM device_locations GROUP BY id)
ORDER BY l.id, l.time DESC) dl
ON dl.id = d.id;
私はしばらくの間、この上で立ち往生してきたと期待して誰かが、正しい道に感謝を私を置くことができます。
私は2つの問題を参照
ここに余分なカンマがあります。「AS distance_to_checkpoint」、 –
クエリは最後のデバイスの位置を取得しません。これは、最新のエントリである可能性がある「ID」ごとに最も高い「ROWID」を有するレコードを取得するが、保証されることは全くない。最後にどのポジションが実際に決定されますか? 「時間」欄では?そして、その名前にもかかわらず、 'device_locations'の' ID'はテーブルのIDではありませんか?代わりにデバイスIDですか?その名前は間違いなく変更する必要があります。そのサブクエリの 'ORDER BY'節は、まったく余計です。 –
使用しているOracleのバージョンはどれですか? –