3

示例数据集:

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

但是,这样做是非常低效的,因为 group by 并且任何匹配一个标签的行都被考虑到 group by (而且我有很大的体积)。

对于这种情况有更有效的查询吗?

我看到的唯一解决方案是让另一个表包含以下内容:

id | hash
---|------
1  | car,bike
2  | boat,bike
3  | plane,car

但这不是一个易于实施和保持最新的解决方案。

附加信息:

  • 名称匹配必须准确(无全文索引)
  • 标签的数量并不总是 2
4

3 回答 3

0

尝试这个:

SELECT id
FROM test
WHERE tag in('car','bike')
GROUP BY id
HAVING COUNT(*) = 2

并在标签列上创建一个非聚集索引

于 2012-10-08T13:35:12.883 回答
0

干得好:

select id from TEST where tag = 'car' and ID in (select id from TEST where tag='bike')
于 2012-10-08T14:13:40.533 回答
-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

于 2012-10-08T13:44:57.280 回答