Since I mainly use Postgresql, I mix 1, 2 and 3: I create CTE's in code which are then reused in queries
sqrl.Select("id", "cte1.*", "cte2.*").From("mytable").Join(CTE1{}).Join(CTE2{}).Where(etc)