次のクエリのより良い解決策を見つけようとしています。これは実行に数秒かかり、TOPを追加すると実行時間が長くなります。
SET STATISTICS TIME ON;
DECLARE @firstTerm NVARCHAR(255);
DECLARE @lastTerm NVARCHAR(255);
DECLARE @totalKeywords INT;
SET @firstTerm = 'john';
SET @lastTerm = 'doe';
SET @totalKeywords=2;
SELECT 20 AS [Priority], clientid AS ClientId
FROM clients.dbo.ViewClientsByFullname WITH (NOLOCK)
WHERE @totalKeywords > 1 AND fullname IN (
SELECT COALESCE(ParentName + ' ','') + @lastTerm AS Name
FROM dbo.DiminuitiveNames WITH (NOLOCK)
WHERE Name=@firstTerm OR ParentName=@firstTerm
UNION
SELECT COALESCE(Name + ' ','') + @lastTerm AS Name
FROM dbo.DiminuitiveNames WITH (NOLOCK)
WHERE ParentName IN (
SELECT ParentName
FROM dbo.DiminuitiveNames WITH (NOLOCK)
WHERE Name=@firstTerm OR ParentName=@firstTerm
)
)
クエリは基本的に、代替名のリストをテーブルでチェックし(たとえば、@ firstTerm = Robertの場合、bob、bobby、robなどのリストも取得します)、それらの代替名も検索します。
INNER JOINでこれを行う方法を考えようとしていましたが、今のところ困惑しています。