Jeg tror, du skal tilføje...
AND outside.asset_tag=inside.asset_tag
...til kriterierne i din ON liste.
Også en RIGHT OUTER JOIN er ikke nødvendig. En INNER JOIN vil give de samme resultater (og kan være mere effektive), da der ikke kan være kombinationer af asset_tag og last_read_date i underforespørgslen, der ikke findes i mp_vehicle_asset_profile .
Selv da kan forespørgslen returnere mere end én række pr. aktivtag, hvis der er "bindinger" -- det vil sige flere rækker med samme last_read_date . I modsætning hertil vil @Lamaks analytisk-baserede svar vilkårligt vælge præcis én række i denne situation.
Din kommentar antyder, at du vil bryde båndene ved at vælge rækken med højeste mtr_reading for last_read_date .
Du kan ændre @Lamaks analysebaserede svar for at gøre dette ved at ændre ORDER BY i OVER klausul til:
ORDER BY last_read_date DESC, mtr_reading DESC
Hvis der stadig er bindinger (dvs. flere rækker med det samme asset_tag , last_read_date , og mtr_reading ), vil forespørgslen igen abritrært vælge præcis én række.
Du kan ændre mit aggregatbaserede svar for at bryde båndene ved at bruge højeste mtr_reading som følger:
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
Hvis der stadig er bindinger (dvs. flere rækker med det samme asset_tag , last_read_date , og mtr_reading ), kan forespørgslen igen returnere mere end én række.
En anden måde, hvorpå de analytisk- og aggregatbaserede svar adskiller sig, er i deres behandling af nuller. Hvis nogen af asset_tag , last_read_date , eller mtr_reading er nul, vil det analytisk-baserede svar returnere relaterede rækker, men det aggregerede-baserede vil ikke (fordi lighedsbetingelserne i joinforbindelsen ikke evalueres til TRUE når en nul er involveret.