Мисля, че трябва да добавите...
AND outside.asset_tag=inside.asset_tag
...на критериите във вашия ON
списък.
Също така RIGHT OUTER JOIN
не е необходимо. INNER JOIN
ще даде същите резултати (и може да бъде по-ефективен), тъй като няма да има комбинации от asset_tag
и last_read_date
в подзаявката, които не съществуват в mp_vehicle_asset_profile
.
Дори тогава заявката може да върне повече от един ред на етикет на актив, ако има „връзки“ -- тоест множество редове с една и съща last_read_date
. За разлика от това, аналитично базираният отговор на @Lamak ще избере произволно точно един ред в тази ситуация.
Вашият коментар предполага, че искате да развалите връзките, като изберете реда с най-висок mtr_reading
за last_read_date
.
Можете да модифицирате аналитично базирания отговор на @Lamak, за да направите това, като промените ORDER BY
в OVER
клауза към:
ORDER BY last_read_date DESC, mtr_reading DESC
Ако все още има връзки (т.е. множество редове с един и същ asset_tag
, last_read_date
и mtr_reading
), заявката отново ще избере само един ред.
Бихте могли да промените моя обобщен отговор, за да прекъснете връзките, като използвате най-високото mtr_reading
както следва:
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
Ако все още има връзки (т.е. множество редове с един и същ asset_tag
, last_read_date
и mtr_reading
), заявката може отново да върне повече от един ред.
Друг начин, по който отговорите, базирани на анализи и агрегати, се различават, е в тяхното третиране на нули. Ако някой от asset_tag
, last_read_date
, или mtr_reading
са null, аналитично базираният отговор ще върне свързани редове, но базираният на агрегат няма (тъй като условията за равенство в съединението не се оценяват като TRUE
когато е включена нула.