1

以下のSQLを1つのステートメントに組み合わせるクリーンな方法はありますか?FilterIDは長さゼロにすることができるため、Filtersテーブルはオプションです。したがって、それを行うためのより良い方法がない限り、私は以下のEXISTSロジックを使用するように「強制」されます。


はすでに認識しています...動的な文字列を作成し、それを使用しEXECて実行できることをすでに認識しています...しかし、それは遅いです。

DocumentとDocumentMetadataの関係は次のとおりです。1対多DocumentDocumentMetadata関係FilterとDocumentMetadataの関係は次のとおりです
1 対多の関係FilterDocumentMetadata

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
4

1 に答える 1

0
JOIN Filter ON Filter.ID = DocumentMetadata.FilterID 
AND (Filter.ID IN (SELECT FilterID FROM @Filters) OR @FilterIDs is null) 

これは、@ filtersテーブルにアイテムがあるか、filtersID(Filtersテーブルを駆動する)にnullが入っているかどうかをカバーする必要があります。nullがOR句に含まれている場合、レコードは通過できるため、ステートメント間で共通の結合句の他の部分に依存します。これにより、1つのselect句を使用して両方をカバーできるようになります。

于 2011-11-14T19:47:28.313 に答える