Penso che tu debba aggiungere...
AND outside.asset_tag=inside.asset_tag
...ai criteri nel tuo ON
elenco.
Anche un RIGHT OUTER JOIN
non è necessario. Un INNER JOIN
darà gli stessi risultati (e potrebbe essere più efficiente), poiché non ci saranno combinazioni di asset_tag
e last_read_date
nella sottoquery che non esiste in mp_vehicle_asset_profile
.
Anche in questo caso, la query può restituire più di una riga per tag asset se sono presenti "legami", ovvero più righe con lo stesso last_read_date
. Al contrario, la risposta analitica di @Lamak sceglierà arbitrariamente esattamente una riga in questa situazione.
Il tuo commento suggerisce che vuoi rompere i legami selezionando la riga con il mtr_reading
più alto per il last_read_date
.
Puoi modificare la risposta analitica di @Lamak per farlo cambiando il ORDER BY
nel OVER
clausola a:
ORDER BY last_read_date DESC, mtr_reading DESC
Se ci sono ancora pareggi (ovvero, più righe con lo stesso asset_tag
, last_read_date
e mtr_reading
), la query selezionerà nuovamente in modo arbitrario esattamente una riga.
Puoi modificare la mia risposta basata su aggregati per rompere i legami usando il massimo mtr_reading
come segue:
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
Se ci sono ancora pareggi (ovvero, più righe con lo stesso asset_tag
, last_read_date
e mtr_reading
), la query potrebbe restituire di nuovo più di una riga.
Un altro modo in cui le risposte analitiche e aggregate differiscono è nel trattamento dei valori nulli. Se uno qualsiasi di asset_tag
, last_read_date
o mtr_reading
sono nulli, la risposta basata sull'analitica restituirà le righe correlate, ma quella basata sull'aggregato no (perché le condizioni di uguaglianza nel join non restituiscono TRUE
quando è coinvolto un null.