• 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.