以下のSQLを1つのステートメントに組み合わせるクリーンな方法はありますか?FilterIDは長さゼロにすることができるため、Filtersテーブルはオプションです。したがって、それを行うためのより良い方法がない限り、私は以下のEXISTSロジックを使用するように「強制」されます。
私
はすでに認識しています...動的な文字列を作成し、それを使用しEXECて実行できることをすでに認識しています...しかし、それは遅いです。
DocumentとDocumentMetadataの関係は次のとおりです。1対多DocumentのDocumentMetadata関係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