SQL Server多个喜欢

时间:2014-10-10 08:47:58

标签: sql sql-server tsql

我有一个不寻常的问题,看起来很简单,但我在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. 一个字(即" oil"),然后系统应该回复所有符合标准的文件(最简单的情况和计算出来)
  2. 如果搜索了多个单词(即"油"和"坦克"),那么我们应该只看到第二个文件,因为它是唯一同时具有油的文件和坦克作为关键词。
    • 尝试使用LIKE"%oil%"和喜欢"%坦克%"并且导致没有创建任何行,因为一个值不能同时是油和油箱。
    • 尝试过喜欢"%oil%"或者"%tank%"但我得到文件1,2和3,因为OR包含所有其他行。
    • 最后一件事,我知道我可以只搜索第一个术语,然后将结果保存到临时表中,然后在第二个表中搜索第二个术语,我将得到我想要的内容。问题在于我并不确切知道要搜索的项目数量。我不想创建一个结构,如果有人搜索6"关键字"我不断将数据存储到另一个临时表中。
  3. 非常感谢任何帮助/想法。

2 个答案:

答案 0 :(得分:0)

一个简单的选择就是做这样的事情:

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

这假设你的tblIndex中没有重复。

我也不确定你是否真的需要这样的。根据您没有的样本数据,基本比较会更有效,并且可以避免可能的碰撞。

答案 1 :(得分: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