我有一个带有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。我希望我已经明确了这一点,因为我需要花费数小时来追踪这个问题,并弄清楚它为什么会发生。还有更多时间试图找出解决问题的方法!
答案 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表示没有。我喜欢这种方法,因为它非常灵活。使用AND
和OR
,您可以将复杂的条件组合在一起,例如%a%'%和'%b%'但不喜欢'%c%'。