2014-10-10 74 views
2

我有一個不尋常的問題,似乎很簡單,但我難住在SQL Server存儲過程。SQL Server多個喜歡

我有2個表,如下所述。

tblMaster

ID, CommitDate, SubUser, OrigFileName 

樣本數據

ID CommitDate SubUser OrigFileName 
---------------------------------------- 
1 2014-10-07 Test1  Test1.pdf 
2 2014-10-08 Test2  Test2.pdf 
3 2014-10-09 Test3  Test3.pdf 

上表基本上是跟蹤提交的文件標題表。除此之外,我們還有一個具有以下結構的細節表。

tblIndex

ID, FileID (Linking column to the header row described above), Word 

樣本數據:

1. 1, 1, Oil 
2. 2, 1, oil 
3. 3, 2, oil 
4. 4, 2, tank 
5. 5, 3, tank 

上述行代表,我們要搜索的字,並且如果在一定條件匹配返回相應的文件名/標題行ID 。我想要做的是如果我搜索

  1. 一個詞(即「油」),那麼系統應該回應所有符合標準的文件(最簡單的情況,並找出問題) )
  2. 如果搜索到多於一個單詞(即「油」和「坦克」),那麼我們應該只能看到第二個文件,因爲它是唯一一個以油和罐爲關鍵詞的文件。
    • 嘗試使用LIKE「%oil%」和LIKE「%tank%」,並且導致沒有行被創建,因爲一個值不能既是油又是油罐。
    • 嘗試做一個LIKE「%oil%」或LIKE「%tank%」,但我得到文件1,2和3,因爲OR包含所有其他行。
    • 最後一件事,我承認我可以只搜索第一項,然後將結果保存到臨時表中,然後在第二個表中搜索第二項,我將得到我正在尋找的內容。這個問題是我不知道會搜索多少物品。如果有人搜索6個「關鍵字」,我不想創建一個結構,我不斷需要將數據存儲到另一個臨時表中。

任何幫助/想法將不勝感激。

回答

0

試試這個吧!與前面的回答略有不同

SELECT distinct FileID,COUNT(distinct t.word) FROM tblIndex t 
WHERE t.Word LIKE '%oil%' OR t.Word LIKE '%tank%' 
GROUP BY FileID 
HAVING COUNT(distinct t.word) > 1 
+0

這很好。如果可能的話,我想問另一個問題。如果我有兩個以上的詞來搜索「大油箱」,那麼HAVING COUNT是否也會增加到2? – 2014-10-10 09:29:55

+0

是的。這是需要匹配的不同單詞的數量,在您的示例中超過2,因此> 2。 – Ndech 2014-10-10 09:47:23

+0

非常感謝。 – 2014-10-10 09:50:25

0

一個簡單的辦法是做這樣的事情:

SELECT FileID 
FROM tblIndex t 
WHERE t.Word LIKE '%oil%' OR t.Word LIKE '%tank%' 
GROUP BY FileID 
HAVING COUNT(*) > 1 

這假設你沒有重複在tblIndex。

我也不確定你是否真的需要類似的東西。根據你的樣本數據你不會,基本的比較會更有效率,並且可以避免可能的衝突。

+0

不幸的是,我確實在索引中有重複的行。原因是此索引代表文件中特定單詞的所有實例。所以我不知道文件中會出現多少次「油」字樣。另外,如果我想要一個精確的匹配,你是對的,沒有必要LIKE。我只想包括我曾嘗試過的。 – 2014-10-10 09:11:21