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 と、1 つのタグに一致するすべての行が 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

bike と car の結果はどちらも 2 行で、これは 2 に等しいためです。

于 2012-10-08T13:44:57.280 に答える