我正在使用Firebird 2.1。
这里有张桌子: IDs, Labels
同一ID可以有多个标签:
10 Peach
10 Pear
10 Apple
11 Apple
12 Pear
13 Peach
13 Apple
假设我有一组标签,例如:(Apple,Pear,Peach)。
如何编写单个选择以返回在给定集中具有所有标签关联的所有ID?优选地,我想在用逗号分隔的字符串中指定集合,例如:('Apple','Pear','Peach')-›这应返回ID = 10。
谢谢!
按照要求,我要发布我的piclrow答案的简单版本。我已经在2.5版本的Firebird上进行了测试,但是OP(Steve)在2.1上进行了测试,它也可以正常工作。
SELECT id
FROM table
WHERE label IN ('Apple', 'Pear', 'Peach')
GROUP BY id
HAVING COUNT(DISTINCT label)=3
该解决方案与pilcrow的缺点相同。...您需要知道要查找多少个值,因为HAVING =条件必须与WHERE IN条件匹配。在这方面,Ed的答案更加灵活,因为它拆分了串联的值字符串参数并计算了值。因此,您只需要更改一个参数,而不是我和pilcrow使用的2个条件即可。
OTOH,如果需要提高效率,我宁愿(但我绝对不确定)Firebird引擎可能不如我建议的那样对Ed的CTE方法进行优化。Firebird非常擅长优化查询,但是当您以这种方式使用CTE时,Firebird是否能够做到这一点我现在还不是很清楚。但是,只需在(id,label)上建立索引,即可优化WHERE + GROUP BY + HAVING。
总之,如果执行时间与您的情况有关,那么无论您选择哪种解决方案,您都可能需要一些解释计划以查看正在发生的情况;)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句