I believe the query should look something like this:
SELECT r.aa, n.bb, nd.cc, u.id, ud.dd, g.attr FROM tab1 AS u INNER JOIN tab2 AS v ON u.user1 = v.user1 AND u.id = 102 LEFT OUTER JOIN tab3 AS a ON a.user = u.user LEFT OUTER JOIN tab4 AS n ON n.nas = a.nas LEFT OUTER JOIN tab5 AS d ON n.nas1 = d.nas1 LEFT OUTER JOIN tab6 AS r ON r.xx = n.xx LEFT OUTER JOIN (SELECT g.attr, g.ac FROM tab7 AS x JOIN tab8 AS atr ON x.sso = atr.sso WHERE UPPER(atr.name) = 'NAME' ) AS g ON a.ac = g.ac
I changed the alias "nd" to "d" and "ud" to "v" so that all aliases are single-letter. The nested OUTER(tab7 g, tab8 atr) in Informix notation itself is an internal join (as in the subsample in my version), but this result set is external, related to a.ac That's what rewriting says.
I used the WHERE clause in a subquery; the WHERE clause can be left in the ON clause if you prefer. Most likely, the optimizer will process both correctly and equivalently. Similarly, AND u.id = 102 in the inner join can be placed in a WHERE clause. Again, the optimizer is likely to lower the filter condition for better performance.
Note that the UPPER function in the subquery probably requires a table scan - unless you have a functional index on UPPER(atr.name) .
Repeating this, the transliteration of the original part of the request is inaccurate.
The original request included the FROM clause:
FROM tab1 u, tab2 ud, OUTER(tab3 a, tab4 n, tab5 nd, tab6 r, OUTER(tab7 g, tab8 atr))
The tables tab3 , tab4 , tab5 and tab6 are internally connected to each other, and the external result is connected to tab1 and tab2 . Similarly, tab8 internally connected to tab7 , but the result of this external is connected to the inner join of tables 3-6. The initial answer I gave (based on the outline answer in the question) will be presented in the old Informix notation using:
FROM tab1 u, tab2 ud, OUTER(tab3 a, OUTER(tab4 n, OUTER(tab5 nd, OUTER(tab6 r, OUTER(tab7 g, tab8 atr)))))
Thus, it would be more accurate to transcribe the original query as:
SELECT r.aa, n.bb, nd.cc, u.id, ud.dd, g.attr FROM tab1 AS u JOIN tab2 AS v ON u.user1 = v.user1 AND u.id = 102 LEFT OUTER JOIN (SELECT * FROM tab3 AS a ON a.user = u.user JOIN tab4 AS n ON n.nas = a.nas JOIN tab5 AS d ON n.nas1 = d.nas1 JOIN tab6 AS r ON r.xx = n.xx LEFT OUTER JOIN (SELECT g.attr, g.ac FROM tab7 AS x JOIN tab8 AS atr ON x.sso = atr.sso WHERE UPPER(atr.name) = 'NAME' ) AS g ON a.ac = g.ac ) AS loj
The rest of the problem will be to use the correct aliases for the columns from the complex loj subquery. Note that in the absence of LEFT, RIGHT, or FULL, it is assumed that the JOIN is an INNER connection; also, if you specify LEFT, RIGHT or FULL, OUTER is optional.
Another detail that should be noted: the behavior of the old-style Informix OUTER join under filter conditions does not match the behavior of standard OUTER SQL joins. It rarely matters, but sometimes it can be important. In general, the behavior of standard SQL OUTER joins is most often what you want, but if you run regression tests and find that there is a difference in answers, the explanation may be that the old-style Informix OUTER join does everything differently from the new standard SQL OUTER join.