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.