Oracle 9i+, met ROW_NUMBER:
SELECT x.project_id,
x.title,
x.event_date,
x.event_desc
FROM (SELECT p.project_id,
p.title,
e.event_date,
e.event_desc,
ROW_NUMBER() OVER(PARTITION BY p.project_id
ORDER BY e.event_date) AS rank
FROM PROJECT p
LEFT JOIN EVENT e ON e.project_fk = p.project_id
AND e.event_type = 301
WHERE p.project_id IN (101,102,103)) x
WHERE x.rank = 1
Oracle 9i+, met WITH en ROW_NUMBER:
WITH example AS (
SELECT p.project_id,
p.title,
e.event_date,
e.event_desc,
ROW_NUMBER() OVER(PARTITION BY p.project_id
ORDER BY e.event_date) AS rank
FROM PROJECT p
LEFT JOIN EVENT e ON e.project_fk = p.project_id
AND e.event_type = 301
WHERE p.project_id IN (101,102,103))
SELECT x.project_id,
x.title,
x.event_date,
x.event_desc
FROM example x
WHERE x.rank = 1