Ik denk dat je moet toevoegen...
AND outside.asset_tag=inside.asset_tag
...volgens de criteria in uw ON
lijst.
Ook een RIGHT OUTER JOIN
is niet nodig. Een INNER JOIN
geeft dezelfde resultaten (en is mogelijk efficiënter), aangezien er geen combinaties van asset_tag
kunnen zijn en last_read_date
in de subquery die niet bestaan in mp_vehicle_asset_profile
.
Zelfs dan kan de zoekopdracht meer dan één rij per itemtag retourneren als er "banden" zijn -- dat wil zeggen, meerdere rijen met dezelfde last_read_date
. Het analytische antwoord van @Lamak kiest daarentegen willekeurig precies één rij in deze situatie.
Je opmerking suggereert dat je de banden wilt verbreken door de rij te kiezen met de hoogste mtr_reading
voor de last_read_date
.
U kunt het analytische antwoord van @Lamak hiervoor aanpassen door de ORDER BY
te wijzigen in de OVER
clausule aan:
ORDER BY last_read_date DESC, mtr_reading DESC
Als er nog steeds gelijken zijn (d.w.z. meerdere rijen met dezelfde asset_tag
, last_read_date
, en mtr_reading
), zal de zoekopdracht opnieuw willekeurig precies één rij kiezen.
Je zou mijn op aggregatie gebaseerde antwoord kunnen wijzigen om banden te verbreken met de hoogste mtr_reading
als volgt:
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
Als er nog steeds gelijken zijn (d.w.z. meerdere rijen met dezelfde asset_tag
, last_read_date
, en mtr_reading
), kan de zoekopdracht opnieuw meer dan één rij opleveren.
Een andere manier waarop de analytische en geaggregeerde antwoorden verschillen, is de behandeling van nullen. Als een van asset_tag
, last_read_date
, of mtr_reading
null zijn, retourneert het op analyse gebaseerde antwoord gerelateerde rijen, maar het op aggregatie gebaseerde antwoord niet (omdat de gelijkheidsvoorwaarden in de join niet worden geëvalueerd als TRUE
wanneer er een null in het spel is.