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 回答