2008-08-21 164 views
10

構建存儲過程/查詢時,我可以/應該使用LIKE標準作爲INNER JOIN的一部分嗎?我不確定我在問正確的事情,所以讓我解釋一下。在INNER JOIN中使用LIKE子句

我正在創建一個程序,該程序將在包含文本的列中搜索要搜索的關鍵字列表。如果我坐在控制檯前,我會執行它是這樣:

SELECT Id, Name, Description 
    FROM dbo.Card 
WHERE Description LIKE '%warrior%' 
     OR 
     Description LIKE '%fiend%' 
     OR 
     Description LIKE '%damage%' 

但一招我拿起一小會兒去做「強類型」列表分析中的存儲過程是解析列表到表變量/臨時表中,將其轉換爲適當的類型,然後在最終結果集中對該表執行INNER JOIN。當向程序發送一個整數ID列表時,這很好用。我結束了最後的查詢,看起來像這樣:

SELECT Id, Name, Description 
    FROM dbo.Card 
     INNER JOIN @tblExclusiveCard ON dbo.Card.Id = @tblExclusiveCard.CardId 

我想用這個技巧與字符串列表。但是因爲我正在尋找一個特定的關鍵字,我將使用LIKE子句。所以理想情況下,我想我會讓我的最終查詢看起來像這樣:

SELECT Id, Name, Description 
    FROM dbo.Card 
     INNER JOIN @tblKeyword ON dbo.Card.Description LIKE '%' + @tblKeyword.Value + '%' 

這是可能的/推薦?

有沒有更好的方法來做這樣的事情?


之所以我把通配符在條文的兩端是因爲有「archfiend」,「獸戰士」,「直接損害」,並且在使用「戰鬥傷害」條款卡片文本。

我得到的印象是,根據性能,我可以使用我指定的查詢或使用全文關鍵字搜索來完成相同的任務?

除了讓服務器對字段進行文本索引我想要進行文本搜索之外,還有什麼我需要做的嗎?

回答

4

您的第一個查詢將起作用,但將需要全表掃描,因爲該列上的任何索引都將被忽略。您還必須執行一些動態SQL來生成所有LIKE子句。

如果您使用SQL Server或檢出其中一個Lucene實現,請嘗試全文搜索。 Joel最近談到了他的成功。

1

看來你正在尋找全文搜索。因爲您想根據卡片說明查詢一組關鍵字並查找任何匹配嗎?正確?

1

就我個人而言,我已經做到了,它對我來說工作得很好。我可以看到的唯一問題可能是無索引列的問題,但我認爲你會遇到與where子句相同的問題。

我對你的建議只是看兩者之間的執行計劃。我相信,就像所有好的編程問題一樣,這取決於具體情況會有所不同。

0

性能將取決於您使用的實際服務器以及數據架構和數據量。使用當前版本的MS SQL Server,該查詢應該可以正常運行(MS SQL Server 7.0具有該語法的問題,但是it was addressed in SP2)。

你是否通過探查器運行該代碼?如果性能足夠快並且數據具有適當的索引,則應該全部設置。

0

LIKE'%fiend%'永遠不會使用seek,LIKE'fiend%'會。只是一個通配符搜索是不可靠的

1

@ Dillie-O
這張桌子有多大?
說明字段的數據類型是什麼?

如果兩者都很小,全文搜索將會過度。

@ Dillie-O
也許不是答案您要尋找的,但我會主張的模式變化...

提出的方案:

create table name(
    nameID identity/int 
    ,name varchar(50)) 

create table description(
    descID identity/int 
    ,desc varchar(50)) --something reasonable and to make the most of it alwase lower case your values 

create table nameDescJunc(
    nameID int 
    ,descID int) 

這將讓你使用索引的,而不具有在解決方案上實施螺栓,並保持您的數據原子。

相關:Recommended SQL database design for tags or tagging

1

一招我拿起一小會兒去 做「強類型」列表分析中 存儲過程是解析 列表到一個表變量/臨時 表

我想你可能會在這裏暗指是把關鍵字加入到一個表,然後使用relational division找到匹配(也可以使用其他表的話排除)。有關SQL中的工作示例,請參閱Keyword Searches by Joe Celko

0

試試這個;

SELECT Id, Name, Description 
FROM dbo.Card 
INNER JOIN @tblKeyword ON dbo.Card.Description LIKE '%' + 
           CONCAT(CONCAT('%',@tblKeyword.Value),'%') + '%' 
3

試試這個

select * from Table_1 a 
    left join Table_2 b on b.type LIKE '%' + a.type + '%' 

這種做法是不理想的。謹慎使用。

+2

我想這應該是'CONCAT( '%',a.type, '%')`HTTP: //stackoverflow.com/a/23276513/443900 – Lee 2016-12-07 21:07:51

0

嘗試...

select * from table11 a inner join table2 b on b.id like (select '%'+a.id+'%') where a.city='abc'. 

其作品對我來說:-)