2009-11-11 77 views
0

我试图一次搜索多个表格作为搜索项。我的查询是:在SQL中搜索多个表格

SELECT item.ItemID 
    FROM Inventory.Item item 
     JOIN Inventory.Category catR // each item can be in several categories 
      ON catR.ItemID = item.ItemID 
     JOIN Category.Category cat 
      ON cat.CategoryID = catR.CategoryID 
     JOIN Inventory.Brand bran 
      ON bran.BrandID = item.BrandID 
    WHERE 
     item.Description LIKE '%' + @term + '%' 
     OR 
     item.Description LIKE '%' + @term 
     OR 
     item.Description LIKE @term + '%' 
     OR 
     item.Description = @term 
     OR 
     cat.CategoryName LIKE '%' + @term + '%' 
      //same pattern as item.Description used to search CategoryName 
      //... 
     OR 
     bran.BrandName LIKE '%' + @term + '%' 
      //same pattern as item.Description used to search BrandName 
      //... 

但结果并不如预期。我在“Casement”类别中有大约50个项目,但当term ==“Casement”只有在item.Description中有“Casement”的项目时才会返回。

我做错了什么?我应该做更好的方法吗?

+0

尝试'LEFT JOIN's。任何缺乏品牌的Inventory.Item(“BrandID”IS NULL或以其他方式被指定为dis-integrated)都将被SQL排除,无论其“CategoryName”是什么。 – pilcrow 2009-11-11 22:40:49

回答

1

这是一个很好的CTE例如:

WITH items AS (
    SELECT i.itemid, 
      i.description, 
      cat.category_name, 
      b.brandname 
     FROM INVENTORY.ITEM i 
    LEFT JOIN INVENTORY.CATEGORY c ON c.itemid = i.itemid 
    LEFT JOIN CATEGORY.CATEGORY cat ON cat.CategoryID = c.categoryid 
    LEFT JOIN INVENTORY.BRAND b ON b.brandid = i.brandid) 
SELECT a.itemid 
    FROM items a 
WHERE a.description LIKE '%' + @term + '%' 
UNION ALL 
SELECT b.itemid 
    FROM items b 
WHERE b.categoryname LIKE '%' + @term + '%' 
UNION ALL 
SELECT c.itemid 
    FROM items c 
WHERE c.brandname LIKE '%' + @term + '%' 

热膨胀系数在SQL Server支持2005+。

+0

这很好。谢谢! – 2009-11-19 14:54:56

2

它足够写

item.Description LIKE '%' + @term + '%' 

,而不是

item.Description LIKE '%' + @term + '%' 
OR 
    item.Description LIKE '%' + @term 
OR 
    item.Description LIKE @term + '%' 
OR 
    item.Description = @term 
0

试试这个:

Select i.ItemID  
From Inventory.Item i 
    Join Inventory.Category ic 
    On ic.ItemID = i.ItemID   
    Join Category.Category cc    
    On cat.CategoryID = ic.CategoryID   
    Join Inventory.Brand ib 
    On ib.BrandID = i.BrandID 
Where CharIndex(@Term, 
     i.Description + '|' + 
    ic.Description + '|' + 
    cc.Description + '|' + 
    ib.Description) > 0 

实现,这将导致所有四个表的全表扫描,所以它如果这些表格很大,会很慢。但考虑到你正在尝试做什么,唯一的选择是在数据库上实现全文索引...

另外,如果可能这些表中的一个不包含匹配的行, ,你应该让所有的连接外连接,并在所有的列引用使用IsNull() ...

Select i.ItemID  
From Inventory.Item i 
    Left Join Inventory.Category ic 
    On ic.ItemID = i.ItemID   
    Left Join Category.Category cc    
    On cat.CategoryID = ic.CategoryID   
    Left Join Inventory.Brand ib 
    On ib.BrandID = i.BrandID 
Where CharIndex(@Term, 
     i.Description + '|' + 
    IsNull(ic.Description, '') + '|' + 
    IsNull(cc.Description, '') + '|' + 
    IsNull(ib.Description, '')) > 0 
+0

出于某种原因,这选择了数据库中的每条记录。 – 2009-11-19 14:45:05

+0

您传递给@Term什么值?如果你传入的值是每个记录的描述字段中的“In”,那么它将返回每条记录,否则你在查询中做了一些其他事情,包括所有记录......哦,我有一个额外的逗号在那里,这应该导致SQL抛出一个语法错误,它现在被删除... – 2009-11-19 16:07:07

2

概念上我会保持它的简单,然后根据需要对性能,从那里改变。首先,我会创建一个视图,然后做选择。

CREATE VIEW vSearchTables 
AS 

SELECT item.ItemID, 'Item' AS TableName, item.Descripton AS Txt 
FROM Inventory.Item item 

UNION ALL 

SELECT catR.ItemID, 'Category' AS TableName, cat.CategoryName AS Txt 
FROM Inventory.Category catR 
JOIN Category.Category cat 
ON cat.CategoryID = catR.CategoryID 

UNION ALL 

SELECT item.ItemID, 'Brand' AS TableName, bran.BrandName AS Txt 
FROM Inventory.Item item 
JOIN Inventory.Brand bran 
ON bran.BrandID = item.BrandID 

GO 



SELECT ItemID 
FROM vSearchTables 
WHERE Txt LIKE '%'[email protected] +'%' 


GO 

如果你有SQL2005和要测试这个概念,可以运行以下命令:

CREATE VIEW vSearchTables 
AS 

select object_name(o.object_id) Object, o.type, m.definition as Txt 
from sys.sql_modules m  
join sys.objects o on m.object_id = o.object_id  

GO 


SELECT * 
FROM vSearchTables 
WHERE Txt LIKE '%TRIGGER%' 
+0

谢谢,我会在早上试试看,并让你知道。 – 2009-11-11 22:57:57

+0

我还是会试试这个......只是没有时间。 – 2009-11-13 02:55:38

+0

我得到一个错误:“视图'附近语法不正确” – 2009-11-19 14:45:37