1

次のクエリのより良い解決策を見つけようとしています。これは実行に数秒かかり、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でこれを行う方法を考えようとしていましたが、今のところ困惑しています。

4

2 に答える 2

1

inこれは、ステートメントの代わりに明示的な結合でどのように機能するのでしょうか。

SELECT 20 AS [Priority], clientid AS ClientId
FROM clients.dbo.ViewClientsByFullname v WITH (NOLOCK) left outer join
     (SELECT distinct COALESCE(ParentName + ' ','') + @lastTerm AS Name
      FROM dbo.DiminuitiveNames WITH (NOLOCK) 
      WHERE Name=@firstTerm OR ParentName=@firstTerm
    ) c1
    on v.fullname = c1.name left outer join
    (select distinct 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
                         )
    ) c2
    on v.fullname = c2.name
WHERE @totalKeywords > 1 AND (c1.name is not null or c2.name is not null)
于 2013-02-23T00:33:50.303 に答える
0

新しいクエリを試してください

SELECT 20 AS [Priority],clientid AS ClientId
FROM clients.dbo.ViewClientsByFullname WITH (NOLOCK)
WHERE @totalKeywords > 1
  AND EXISTS (
              SELECT 1
              FROM dbo.DiminuitiveNames WITH (NOLOCK) 
              WHERE Name=@firstTerm OR ParentName=@firstTerm
                AND (COALESCE(ParentName + ' ','') + @lastTerm = fullname
                  OR COALESCE(Name + ' ','') + @lastTerm = fullname)    
              )
于 2013-02-23T00:39:35.537 に答える