示例数据集:
id | tag
---|------
1 | car
1 | bike
2 | boat
2 | bike
3 | plane
3 | car
id
和tag
都已编入索引。
我正在尝试获取与标签[汽车,自行车]相匹配的ID(标签数量可能会有所不同)。
这样做的天真查询是:
SELECT id
FROM test
WHERE tag = 'car'
OR tag = 'bike'
GROUP BY id
HAVING COUNT(*) = 2
然而,这样做是非常低效的,因为分组和事实是任何匹配一个标签的线都被考虑到(并且我有一个大的体积)。
这种情况是否有更高效的查询?
我看到的唯一解决方案是让另一个表包含以下内容:
id | hash
---|------
1 | car,bike
2 | boat,bike
3 | plane,car
但这不是一个易于实施和维持最新的解决方案。
其他信息:
答案 0 :(得分:0)
试试这个:
SELECT id
FROM test
WHERE tag in('car','bike')
GROUP BY id
HAVING COUNT(*) = 2
在标记列
上创建非聚簇索引答案 1 :(得分:0)
你走了:
select id from TEST where tag = 'car' and ID in (select id from TEST where tag='bike')
答案 2 :(得分:-1)
不确定我是否得到你,但试试这个:
select tag, count(*) as amount
into #temp
from MYTABLE
group by tag
select t1.tag
from #temp t1 join #temp t2 on t1.amount=t2.amount and t1.tag=t2.tag and t1.amount=2
应该导致自行车和汽车,因为它们都有2行,等于2