Saya rasa Anda perlu menambahkan...
AND outside.asset_tag=inside.asset_tag
...dengan kriteria di ON
. Anda daftar.
Juga sebuah RIGHT OUTER JOIN
tidak diperlukan. Sebuah INNER JOIN
akan memberikan hasil yang sama (dan mungkin lebih efisien), karena tidak boleh ada kombinasi asset_tag
dan last_read_date
di subquery yang tidak ada di mp_vehicle_asset_profile
.
Meski begitu, kueri dapat mengembalikan lebih dari satu baris per tag aset jika ada "ikatan" -- yaitu, beberapa baris dengan last_read_date
yang sama . Sebaliknya, jawaban berbasis analitik @Lamak akan secara sewenang-wenang memilih tepat satu baris situasi ini.
Komentar Anda menunjukkan bahwa Anda ingin memutuskan hubungan dengan memilih baris dengan mtr_reading
tertinggi untuk last_read_date
.
Anda dapat memodifikasi jawaban berbasis analitik @ Lamak untuk melakukan ini dengan mengubah ORDER BY
di OVER
klausa untuk:
ORDER BY last_read_date DESC, mtr_reading DESC
Jika masih ada ikatan (yaitu, beberapa baris dengan asset_tag
yang sama , last_read_date
, dan mtr_reading
), kueri akan kembali memilih tepat satu baris.
Anda dapat memodifikasi jawaban berbasis agregat saya untuk memutuskan hubungan menggunakan mtr_reading
tertinggi sebagai berikut:
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
Jika masih ada ikatan (yaitu, beberapa baris dengan asset_tag
yang sama , last_read_date
, dan mtr_reading
), kueri dapat kembali menampilkan lebih dari satu baris.
Satu cara lain yang membedakan jawaban berbasis analitik dan agregat adalah dalam perlakuan mereka terhadap nol. Jika ada asset_tag
, last_read_date
, atau mtr_reading
adalah nol, jawaban berbasis analitik akan mengembalikan baris terkait, tetapi jawaban berbasis agregat tidak akan (karena kondisi kesetaraan dalam gabungan tidak mengevaluasi ke TRUE
ketika null terlibat.