SELECT id.*, NVL(nm.lname, ' ') lname, NVL(nm.fname, ' ') fname, NVL(nm.mname, ' ') mname, NVL(ad.city, ' ') city, NVL(ad.street, ' ') street... FROM id_table id LEFT JOIN name_tbl nm ON id.id = nm.id LEFT JOIN address_tbl ad ON id.id = ad.id WHERE (nm.effective_date IS NULL OR TTOC(nm.effective_date, 1) = (SELECT MAX(TTOC(x.effective_date, 1)) FROM name_tbl x WHERE x.id = nm.id)) AND (ad.effective_date IS NULL OR TTOC(ad.effective_date, 1) = (SELECT MAX(TTOC(y.effective_date, 1)) FROM address_tbl y WHERE y.id = ad.id))>I have an ID table which links out to a name table and also links out to an address table. The name table contains all of the name changes of a customer through time using effective_dates. The address table does the same thing using effective_dates. In other words, we never delete or update any records in the name or address table; just add.