Заменить левое внешнее соединение в SQL Server (SSMS) - PullRequest
0 голосов
/ 01 июля 2018

Когда я пытаюсь создать уникальный индекс в VIEW ниже, я получаю следующую ошибку,

Сообщение 10113, Уровень 16, Состояние 1, Строка 431
Невозможно создать индекс для представления "V3CONv.ADVANCED.BillsToBeDeletedVIEW", так как он использует соединение LEFT, RIGHT или FULL OUTER, а соединения OUTER не допускаются в индексированных представлениях. Попробуйте вместо этого использовать INNER join.

INNER JOIN создаст набор данных, отличный от требуемого, как я могу заменить LEFT OUTER JOIN на сервере Microsoft SQL ??

CREATE VIEW ADVANCED.BillsToBeDeletedVIEW
WITH SCHEMABINDING
AS
    SELECT DISTINCT 
        I_BILLNUMBER 
    FROM 
        ADVANCED.BIF951_C 
    LEFT OUTER JOIN 
        ADVANCED.BIF003ToBeDeleted ON BIF003ToBeDeleted.C_CUSTOMER = ADVANCED.BIF951_C.C_CUSTOMER 
                                   AND BIF003ToBeDeleted.C_ACCOUNT = ADVANCED.BIF951_C.C_ACCOUNT
    WHERE 
        BIF003ToBeDeleted.C_CUSTOMER IS NOT NULL
        OR D_BILLDATE < '2016-06-01' 

1 Ответ

0 голосов
/ 01 июля 2018

Вы можете использовать два отдельных индексированных представления, например:

create schema ADVANCED
go

    create table ADVANCED.BIF951_C(id int, I_BILLNUMBER int, D_BILLDATE datetime, C_CUSTOMER INT, C_ACCOUNT INT)

    CREATE TABLE ADVANCED.BIF003ToBeDeleted(ID INT, C_CUSTOMER INT, C_ACCOUNT INT)

    GO

    CREATE OR ALTER VIEW ADVANCED.BillsToBeDeletedVIEW_1
    WITH SCHEMABINDING
    AS
        SELECT  
            I_BILLNUMBER 
        FROM 
            ADVANCED.BIF951_C 
        JOIN 
            ADVANCED.BIF003ToBeDeleted ON BIF003ToBeDeleted.C_CUSTOMER = ADVANCED.BIF951_C.C_CUSTOMER 
                                       AND BIF003ToBeDeleted.C_ACCOUNT = ADVANCED.BIF951_C.C_ACCOUNT
     GO

     CREATE UNIQUE CLUSTERED INDEX IX_BillsToBeDeletedVIEW_1 ON ADVANCED.BillsToBeDeletedVIEW_1(I_BILLNUMBER)
     GO


    CREATE OR ALTER VIEW ADVANCED.BillsToBeDeletedVIEW_2
    WITH SCHEMABINDING
    AS


        SELECT I_BILLNUMBER
        FROM  ADVANCED.BIF951_C 
        WHERE D_BILLDATE < CONVERT(DATETIME,'2016-06-01',120)

        GO


     CREATE UNIQUE CLUSTERED INDEX IX_BillsToBeDeletedVIEW_2 ON ADVANCED.BillsToBeDeletedVIEW_2(I_BILLNUMBER)
     GO

     CREATE OR ALTER VIEW ADVANCED.BillsToBeDeletedVIEW
     AS 

       SELECT I_BILLNUMBER
       FROM BillsToBeDeletedVIEW_1
       UNION
       SELECT I_BILLNUMBER
       FROM BillsToBeDeletedVIEW_2
...