追加する必要があると思います...
AND outside.asset_tag=inside.asset_tag
... ON
の基準に リスト。
また、RIGHT OUTER JOIN
必要ありません。 INNER JOIN
asset_tag
の組み合わせはあり得ないため、同じ結果が得られます(より効率的になる可能性があります)。 およびlast_read_date
mp_vehicle_asset_profile
に存在しないサブクエリ内 。
それでも、「同点」がある場合、つまり、同じlast_read_date
を持つ複数の行がある場合、クエリはアセットタグごとに複数の行を返す可能性があります。 。対照的に、@ Lamakの分析ベースの回答では、この状況で1行だけが任意に選択されます。
あなたのコメントは、mtr_reading
が最も高い行を選択して関係を解消したいことを示唆しています。 last_read_date
の場合 。
ORDER BY
を変更することで、@Lamakの分析ベースの回答を変更してこれを行うことができます。 OVER
で 条項:
ORDER BY last_read_date DESC, mtr_reading DESC
それでも同点がある場合(つまり、同じasset_tag
を持つ複数の行 、last_read_date
、およびmtr_reading
)、クエリは再び正確に1行を選択します。
最高のmtr_reading
を使用して、集計ベースの回答を変更して関係を解消することができます 次のように:
SELECT
outside.asset_tag,
outside.description,
outside.asset_type,
outside.asset_group,
outside.status_code,
outside.license_no,
outside.rentable_yn,
outside.manufacture_code,
outside.model,
outside.manufacture_vin,
outside.vehicle_yr,
outside.meter_id,
outside.mtr_uom,
outside.mtr_reading,
outside.last_read_date
FROM
mp_vehicle_asset_profile outside
INNER JOIN
(
SELECT
asset_tag,
MAX(last_read_date) AS last_read_date,
MAX(mtr_reading) KEEP (DENSE_RANK FIRST ORDER BY last_read_date DESC) AS mtr_reading
FROM
mp_vehicle_asset_profile
GROUP BY
asset_tag
) inside
ON
outside.asset_tag = inside.asset_tag
AND
outside.last_read_date = inside.last_read_date
AND
outside.mtr_reading = inside.mtr_reading
それでも同点がある場合(つまり、同じasset_tag
を持つ複数の行 、last_read_date
、およびmtr_reading
)、クエリは再び複数の行を返す場合があります。
分析ベースの回答と集計ベースの回答が異なるもう1つの方法は、nullの処理です。 asset_tag
のいずれかがある場合 、last_read_date
、またはmtr_reading
nullの場合、分析ベースの回答は関連する行を返しますが、集計ベースの回答は返しません(結合の等価条件がTRUE
に評価されないため) nullが含まれる場合。