• It won't be slow if you avoid the self join of the CTE, which causes it to go through both tables twice. This will work almost as fast as if you didn't do any formatting.

    WITH

    cteEnumerate AS

    (

    SELECT p.Name

    ,m.Model

    ,RowNum = ROW_NUMBER() OVER (PARTITION BY p.ID ORDER BY m.Model)

    FROM @Products p

    JOIN @models m ON p.ID = m.IDProduct

    )

    SELECT Product = CASE WHEN RowNum > 1 THEN '' ELSE Name END,

    Model

    FROM cteEnumerate

    ;

    --Jeff Moden


    RBAR is pronounced "ree-bar" and is a "Modenism" for Row-By-Agonizing-Row.
    First step towards the paradigm shift of writing Set Based code:
    ________Stop thinking about what you want to do to a ROW... think, instead, of what you want to do to a COLUMN.

    Change is inevitable... Change for the better is not.


    Helpful Links:
    How to post code problems
    How to Post Performance Problems
    Create a Tally Function (fnTally)