我正在尝试一次搜索多个表格以查找搜索字词。我的疑问是:
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 :(得分:2)
足以写
item.Description LIKE '%' + @term + '%'
而不是
item.Description LIKE '%' + @term + '%'
OR
item.Description LIKE '%' + @term
OR
item.Description LIKE @term + '%'
OR
item.Description = @term
答案 1 :(得分: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 '%'+@term +'%'
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%'
答案 2 :(得分: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+支持CTE。
答案 3 :(得分: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
意识到这将导致所有四个表的全表扫描,因此如果这些表很大,它将会很慢。但考虑到你要做的事情,唯一的选择是在数据库上实现全文索引......
此外,如果可能这些表中的一个不包含yr连接条件的匹配行,则应该进行所有连接外连接,并对所有列引用使用IsNull()
... < / p>
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