• SQL Server is turning the OJ into an IJ because of the inner-joined "trail". You can get around it by changing the position of the ON clauses like this:

    SELECT P.policy_internal_id,

    RTRIM(P.contract_main_id)

    + CASE P.contract_sub_id

    WHEN '00' THEN ''

    ELSE P.contract_sub_id END

    + CASE

    WHEN PAN.value_num IS NULL THEN ''

    ELSE '-' + CONVERT(VARCHAR(9), CONVERT(INT, PAN.value_num)) END

    [rpt_policy_contract]

    FROM dbo.POLICY P

    LEFT OUTER JOIN dbo.POLICY_ATTRIBUTES_NUM PAN

    inner JOIN dbo.PRODUCT_ATTRIBUTES PA

    inner JOIN dbo.PRODUCT_POSSIBLE_ATTRIBUTES PPA

    ON PA.prod_poss_attr_id = PPA.prod_poss_attr_id AND PPA.prod_attr_logical_key = 'NB_RENEWAL'

    ON PAN.prod_attr_id = PA.prod_attr_id

    ON P.policy_internal_id = PAN.policy_internal_id

    The real question is...why do you want an indexed view? Is it because this query isn't performing as you might expect it to?

    “Write the query the simplest way. If through testing it becomes clear that the performance is inadequate, consider alternative query forms.” - Gail Shaw

    For fast, accurate and documented assistance in answering your questions, please read this article.
    Understanding and using APPLY, (I) and (II) Paul White
    Hidden RBAR: Triangular Joins / The "Numbers" or "Tally" Table: What it is and how it replaces a loop Jeff Moden