不喜欢搜索链接表

时间:2014-12-25 21:36:07

标签: sql sql-like sql-server-ce-4

我有一个带有ID和文本列的Model表:

ID    |    Description
=======================
1     |     Model A
2     |     Model B
3     |     Model C

我有一个带有ID和很多其他列的Items表。这两个表通过中间表调用ItemModels与以下数据链接:

ID    |    ItemID     |    ModelID
==================================
1     |       1       |       1
2     |       1       |       2
3     |       2       |       1
4     |       2       |       2
5     |       2       |       3
6     |       3       |       2

我想使用标准“包含,不包含,开始,结束”方法进行搜索。

如果我使用LIKE运算符执行“Contains”,“Starts With”或“Ends With”搜索,这可以正常工作,我总能得到正确的结果,但是在使用NOT LIKE运算符时遇到问题:

如果我想返回模型描述中不包含“C”(不区分大小写)的所有项目,我只想执行以下操作:

SELECT ItemID FROM ItemModels INNER JOIN Model ON ItemModels.ModelID = Model.ID WHERE Description NOT LIKE '%C%'

我希望此查询返回第1项和第3项,因为它们都没有包含“C”的任何模型,但是此查询也将返回第2项,因为它将使用ItemModel.ID = 3来查找记录并说“那是不包含C所以我们想要归还!“这当然是不受欢迎的行为。

所以我的问题是:

如何进行包含链接表中所有记录的非LIKE搜索?

PS。我希望我已经明确了这一点,因为我需要花费数小时来追踪这个问题,并弄清楚它为什么会发生。还有更多时间试图找出解决问题的方法!

1 个答案:

答案 0 :(得分:2)

您不希望任何项目符合您的条件。考虑聚合和having子句:

SELECT im.ItemID
FROM im.ItemModels im INNER JOIN
     Model m
     ON im.ModelID = m.ID
GROUP BY im.ItemId
HAVING SUM(CASE WHEN Description LIKE '%C%' THEN 1 ELSE 0 END) = 0;

此查询计算与项目匹配的模型数。 = 0表示没有。我喜欢这种方法,因为它非常灵活。使用ANDOR,您可以将复杂的条件组合在一起,例如%a%'%和'%b%'但不喜欢'%c%'。