您可以为此使用PARTITIONed OUTER JOIN。
来自 Oracle 12:
SELECT t.gen_id,
s.serial_code,
COALESCE(t.is_verified, 'not_present') AS is_verified
FROM (SELECT 'smcg' AS serial_code FROM DUAL UNION ALL
SELECT 'fmcg' FROM DUAL) s
LEFT OUTER JOIN (
SELECT *
FROM table_name
ORDER BY gen_id DESC
FETCH FIRST ROW WITH TIES
) t
PARTITION BY (gen_id)
ON (s.serial_code = t.serial_code)
在 Oracle 11 中,您可以使用:
SELECT t.gen_id,
s.serial_code,
COALESCE(t.is_verified, 'not_present') AS is_verified
FROM (SELECT 'smcg' AS serial_code FROM DUAL UNION ALL
SELECT 'fmcg' FROM DUAL) s
LEFT OUTER JOIN (
SELECT gen_id, serial_code, is_verified
FROM (
SELECT t.*,
RANK() OVER (ORDER BY gen_id DESC) AS rnk
FROM table_name t
)
WHERE rnk = 1
) t
PARTITION BY (gen_id)
ON (s.serial_code = t.serial_code)
其中,对于样本数据:
CREATE TABLE table_name (gen_id, serial_code, is_verified) AS
SELECT 1, 'fmcg', 'Y' FROM DUAL UNION ALL
SELECT 1, 'smcg', 'Y' FROM DUAL UNION ALL
SELECT 1, 'xmcg', 'N' FROM DUAL UNION ALL
SELECT 2, 'smcg', 'Y' FROM DUAL UNION ALL
SELECT 2, 'fmcg', 'Y' FROM DUAL UNION ALL
SELECT 2, '2mcg', 'Y' FROM DUAL UNION ALL
SELECT 3, 'smcg', 'Y' FROM DUAL UNION ALL
SELECT 3, 'amcg', 'Y' FROM DUAL;
两个输出:
PARTITION BY (gen_id)
ON (s.serial_code = t.serial_code)
| GEN_ID |
SERIAL_CODE |
IS_VERIFIED |
| 3 |
fmcg |
not_present |
| 3 |
smcg |
Y |
Oracle 18 dbfiddle here - Oracle 11 dbfiddle here