my life is now writing sql queries like this. ahg.

with tree(kind, path, idEphDefault, field, idModelField) as 
/* seed the query with the defaults ephemera (kind,field,value requests;
   the idEphDefault and field will be constant over the hierarchy for each entry.
*/
( select ep.kind, parent.path, ep.idEphDefault, ep.field, 
	/* for each kind in the hierarchy, try to find the modeled kind, field pair */
	( select m.rowid from mdl_field m
		where m.kind = ep.kind
		and m.field = ep.field
	) as idModelField
	/* find the parent path for the kind named by the seed */
    from eph_named_default ep
   	join mdl_kind parent
	on parent.kind = ep.kind 
union all
	/* add in the parents of each referenced kind */
	select super.kind, super.path, tree.idEphDefault, tree.field,
		( select m.rowid from mdl_field m
			where m.kind = super.kind
			and m.field = tree.field
		 ) as idModelField
	from tree, mdl_kind super
	/* stop once we have found the modeled kind,field parent */
	where idModelField is null
	/* clip the parent kind from the ancestry path */
	and super.kind = substr(tree.path, 0, instr(tree.path || ",", ",")) 
)
/* return the modeled kind,field,type and each ephemera's kind,field,value;
    idModelField is 0 for missing kinds or kinds below the ephemera's kind, field pair
 */
select idEphDefault, coalesce(idModelField,0) as idModelField from tree