Ich denke, Sie müssen hinzufügen ...
AND outside.asset_tag=inside.asset_tag
...zu den Kriterien in Ihrem ON
Liste.
Auch ein RIGHT OUTER JOIN
wird nicht benötigt. Ein INNER JOIN
liefert die gleichen Ergebnisse (und ist möglicherweise effizienter), da es keine Kombinationen von asset_tag
geben wird und last_read_date
in der Unterabfrage, die in mp_vehicle_asset_profile
nicht vorhanden sind .
Selbst dann kann die Abfrage mehr als eine Zeile pro Asset-Tag zurückgeben, wenn es „Krawatten“ gibt – d. h. mehrere Zeilen mit demselben last_read_date
. Im Gegensatz dazu wird die analysebasierte Antwort von @Lamak in dieser Situation willkürlich genau eine Zeile auswählen.
Ihr Kommentar schlägt vor, dass Sie Bindungen aufheben möchten, indem Sie die Zeile mit dem höchsten mtr_reading
auswählen für das last_read_date
.
Sie können die analysebasierte Antwort von @Lamak ändern, indem Sie den ORDER BY
ändern im OVER
Klausel zu:
ORDER BY last_read_date DESC, mtr_reading DESC
Wenn es immer noch Bindungen gibt (d. h. mehrere Zeilen mit demselben asset_tag
, last_read_date
, und mtr_reading
), wird die Abfrage wieder willkürlich genau eine Zeile auswählen.
Sie könnten meine aggregierte Antwort ändern, um Krawatten mit dem höchsten mtr_reading
zu brechen wie folgt:
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
Wenn es immer noch Bindungen gibt (d. h. mehrere Zeilen mit demselben asset_tag
, last_read_date
, und mtr_reading
), kann die Abfrage wieder mehr als eine Zeile zurückgeben.
Eine andere Art, in der sich die analytischen und aggregierten Antworten unterscheiden, ist die Behandlung von Nullen. Falls eines von asset_tag
, last_read_date
, oder mtr_reading
null sind, gibt die analysebasierte Antwort verwandte Zeilen zurück, die aggregierte jedoch nicht (da die Gleichheitsbedingungen im Join nicht zu TRUE
ausgewertet werden wenn eine Null beteiligt ist.