Here is what I came up with:
SELECT ISNULL(ac.code, b1.code) AS code, a2.aname, b1.bname, ac.cname
FROM (SELECT a.code, a.aname, c.cname, ROW_NUMBER() OVER (Partition BY a.aname ORDER BY a.code, a.aname) AS RNO
FROM @a AS a
LEFT JOIN @C AS c
ON a.code = c.code) AS ac
FULL JOIN (SELECT b.code, b.bname, ROW_NUMBER() OVER (Partition BY b.code ORDER BY b.code, b.bname) AS RNO
FROM @b-2 b) AS b1
ON ac.code = b1.code
AND ac.RNO = b1.RNO
LEFT JOIN @a AS a2
ON ISNULL(ac.code, b1.code) = a2.code
ORDER BY ISNULL(ac.code, b1.code), a2.aname, b1.bname, ac.cname
-------------------------------------------------------------
we travel not to escape life but for life not to escape us
Don't fear failure, fear regret.