Tôi nghĩ bạn cần thêm ...
AND outside.asset_tag=inside.asset_tag
... theo tiêu chí trong ON
của bạn danh sách.
Cũng là một RIGHT OUTER JOIN
là không cần thiết. INNER JOIN
sẽ cho kết quả giống nhau (và có thể hiệu quả hơn), vì sẽ không thể có sự kết hợp của asset_tag
và last_read_date
trong truy vấn con không tồn tại trong mp_vehicle_asset_profile
.
Ngay cả khi đó, truy vấn có thể trả về nhiều hơn một hàng cho mỗi thẻ nội dung nếu có "ràng buộc" - nghĩa là nhiều hàng có cùng một last_read_date
. Ngược lại, câu trả lời dựa trên phân tích của @ Lamak sẽ tùy ý chọn chính xác một hàng trong trường hợp này.
Nhận xét của bạn cho thấy rằng bạn muốn phá vỡ mối quan hệ bằng cách chọn hàng có mtr_reading
cao nhất cho last_read_date
.
Bạn có thể sửa đổi câu trả lời dựa trên phân tích của @ Lamak để thực hiện điều này bằng cách thay đổi ORDER BY
trong OVER
mệnh đề:
ORDER BY last_read_date DESC, mtr_reading DESC
Nếu vẫn có mối ràng buộc (nghĩa là nhiều hàng có cùng một asset_tag
, last_read_date
và mtr_reading
), truy vấn sẽ lại chọn chính xác một hàng một cách tùy ý.
Bạn có thể sửa đổi câu trả lời dựa trên tổng hợp của tôi để phá vỡ mối quan hệ bằng cách sử dụng mtr_reading
cao nhất như sau:
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
Nếu vẫn có mối ràng buộc (nghĩa là nhiều hàng có cùng một asset_tag
, last_read_date
và mtr_reading
), truy vấn có thể trả lại nhiều hơn một hàng.
Một cách khác mà các câu trả lời dựa trên phân tích và tổng hợp khác nhau là ở cách xử lý các giá trị rỗng. Nếu bất kỳ asset_tag
nào , last_read_date
hoặc mtr_reading
là null, câu trả lời dựa trên phân tích sẽ trả về các hàng có liên quan, nhưng câu trả lời dựa trên tổng hợp sẽ không (bởi vì các điều kiện bình đẳng trong phép nối không đánh giá thành TRUE
khi một null có liên quan.