2011-04-01 84 views
0

我将如何去结合这两个语句。基本上这是一个搜索,我希望用户能够搜索名称,公司或笔记。笔记在另一个表中称为行为。其中有一个CID的外键。我希望它只返回匹配任何已填写内容的结果。因此,搜索名称:Bob Notes:Golf不会返回所有在笔记中打高尔夫球的用户,但只会返回一个名字为bob的人,并在笔记字段中打高尔夫球。SQL创建搜索语句问题

我遇到的问题是如果Notes确实返回多于一行,那么它会破坏我使用第一条语句的机会。

我使用的是SQL-Server 2005的感谢

1日声明:

SELECT DISTINCT CID, Name, Comp, Email 
From Con 
Where (Name IS NULL OR Name LIKE '%' + @name + '%') 
AND (Comp IS NULL or Comp LIKE '%' + @comp + '%') 

第二届声明:

If @notes <> '' 
Begin 
SET @newid = 
(
Select CID  
From Act 
Where Note LIKE '%' + @notes + '%' 
) 
Select DISTINCT CID, Name, Comp, Email 
From Contacts c 
Where (CID= @newid) 
End 

回答

0
SELECT DISTINCT CID, Name, Comp, Email 
From Con 
Where (Name IS NULL OR Name LIKE '%' + @name + '%') 
    AND (Comp IS NULL or Comp LIKE '%' + @comp + '%') 
    AND (
     @notes = '' 
     OR EXISTS (
      Select CID  
      From Act 
      Where Note LIKE '%' + @notes + '%' 
       AND @notes <> '' 
       AND Act.CID = Con.CID 
     ) 
    ) 
+0

的一种方法,它不依赖在相关的子查询上可能会有更好的表现。 – Shawn 2011-04-01 17:58:37

0
SELECT DISTINCT CID, Name, Comp, Email 
From Con 
Where (Name IS NULL OR Name LIKE '%' + @name + '%') 
AND (Comp IS NULL or Comp LIKE '%' + @comp + '%') 
UNION ALL 
Select DISTINCT CID, Name, Comp, Email 
From Contacts c 
Where (CID = (Select CID From Act Where @notes <> '' AND Note LIKE '%' + @notes + '%'))