TSQL更改查询和查询

时间:2015-02-04 10:15:43

标签: sql sql-server performance tsql

我有一对多关系表

ReviewId     EffectId
1       |    2
1       |    5
1       |    8
2       |    2
2       |    5
2       |    9
2       |    3
3       |    3
3       |    2
3       |    9

在网站中,用户选择他选择的每种效果,并获得所有相关评论。 我发了in个查询 例如,如果用户选择效果2和5 我的询问:“

select reviewed from table_name where effected in(2,5)

现在我需要获得包含两种效果的所有评论 所有具有效果2和效果5的评论 什么是最好的查询来做到这一点? 对我来说重要的是查询将尽可能快地运行。 为此,我还可以更改表模式(如果需要),例如添加一个包含所有效果的缓存字段,如逗号

Reviewed      cachedEffects
1          |  ,2,5,8
2          |  ,2,5,9,3,
3          |  ,3,2,9

enter image description here

1 个答案:

答案 0 :(得分:1)

你可以这样做:

 select reviewid
 from 
 tbl
 where effectid in (2,5)
 group by reviewid
 having count(distinct effectid) > 1

Demo

count (distinct effectid)用于确保结果仅包含具有不同reviewID值的多个记录的effectID个。 where子句用于根据过滤条件同时过滤掉2和5。

这里要注意的关键是我们按reviewID进行分组,并使用不同effectID值的计数来确保只返回那些同时包含2和5的记录。如果我们不这样做,查询将返回effectID等于2或5的所有行。

为了提高性能,您可以在reviewID上创建索引。