Объединение динамических таблиц в один запрос - PullRequest
1 голос
/ 14 ноября 2011

Есть ли чистый способ объединить приведенный ниже SQL в 1 оператор?FilterID могут быть нулевой длины, поэтому таблица Filters является необязательной.Поэтому, если нет лучшего способа сделать это, я «вынужден» использовать приведенную ниже логику EXISTS.

Я уже понимаю ... Я уже понимаю, что могу построить динамическую строку и использовать EXEC для ее запуска ... но это медленно.

Отношение Document-DocumentMetadata: 1 Document ко многим DocumentMetadataОтношение Filter-to-DocumentMetadata: 1 Filter ко многим DocumentMetadata s

SQL выглядит следующим образом:

   DECLARE @SearchTerms NVARCHAR(MAX)
    DECLARE @FilterIDs  VARCHAR(100)
    SET @SearchTerms        = '7%'
    SET @FilterIDs      = '12'
    ------------------------
    DECLARE @Filters TABLE (FilterID int)

    IF(@FilterIDs IS NOT NULL)
            INSERT INTO @Filters SELECT items AS INT FROM Split(@filterIDs, ',')

    IF EXISTS(SELECT FilterID FROM @Filters)
        BEGIN
            SELECT
                Document.ID AS DocumentID
                ,Document.SourceID
                ,Document.Name
                ,Document.Title
                ,Document.DocumentUrl
                ,Document.DocType
                ,Document.DocumentModifiedDate
                ,Document.Library
                ,DocumentMetadata.ID AS DocumentMetadataID
                ,DocumentMetadata.DocumentID
                ,DocumentMetadata.FilterID
                ,DocumentMetadata.Value
            FROM Document
            JOIN DocumentMetadata
                ON DocumentMetadata.DocumentID = Document.ID
            JOIN Filter
                ON Filter.ID = DocumentMetadata.FilterID
                AND Filter.ID IN (SELECT FilterID FROM @Filters)
            WHERE
                Document.Name LIKE @SearchTerms
                OR Document.Title LIKE @SearchTerms
            ORDER BY
                Document.Name, Document.Title
        END
    ELSE
        BEGIN
            SELECT
                Document.ID AS DocumentID
                ,Document.SourceID
                ,Document.Name
                ,Document.Title
                ,Document.DocumentUrl
                ,Document.DocType
                ,Document.DocumentModifiedDate
                ,Document.Library
                ,DocumentMetadata.ID AS DocumentMetadataID
                ,DocumentMetadata.DocumentID
                ,DocumentMetadata.FilterID
                ,DocumentMetadata.Value
            FROM Document
            JOIN DocumentMetadata
                ON DocumentMetadata.DocumentID = Document.ID
            JOIN Filter
                ON Filter.ID = DocumentMetadata.FilterID
            WHERE
                Document.Name LIKE @SearchTerms
                OR Document.Title LIKE @SearchTerms
            ORDER BY
                Document.Name, Document.Title
        END

1 Ответ

0 голосов
/ 14 ноября 2011
JOIN Filter ON Filter.ID = DocumentMetadata.FilterID 
AND (Filter.ID IN (SELECT FilterID FROM @Filters) OR @FilterIDs is null) 

Это должно касаться того, есть ли у вас элементы в таблице @filters или вы указали null для filtersID (который управляет таблицей Filters). В случае, если в операторе OR указано значение null, запись разрешается, поэтому она опирается на другую часть предложения соединения, которая является общей для ваших операторов. Это должно позволить вам просто использовать 1 предложение select, чтобы охватить оба.

...