1

根据主题 - 我正在尝试用 INNER 或 LEFT JOIN 替换慢速 SQL IN 语句。我想要摆脱的:

SELECT 
    sum(VR.Weight) 
FROM 
    verticalresponses VR
WHERE RespondentID IN
(
    SELECT RespondentID FROM verticalstackedresponses VSR WHERE VSR.Question = 'Brand     Aware'
)

以上我尝试替换为

SELECT 
    sum(VR.Weight) 
FROM 
    verticalresponses VR
    LEFT/INNER JOIN verticalstackedresponses VSR ON VSR.RespondentID = VR.RespondentID     AND VSR.Question = 'Brand Aware' 

但不幸的是,我得到了不同的结果。任何人都可以看到为什么,如果可能的话,建议一个可以更快完成工作的解决方案?非常感谢!

4

3 回答 3

2

子查询

SELECT RespondentID FROM verticalstackedresponses VSR WHERE VSR.Question = 'Brand     Aware'

可能会为任何 RespondentID 返回多行,那么您会在 join 和 in 版本之间得到不同的结果

与此类似的东西可能会产生相同的结果

SELECT 
    sum(VR.Weight) 
FROM 
    verticalresponses VR
JOIN(     SELECT distinct RespondentID FROM verticalstackedresponses 
          WHERE VSR.Question = 'Brand     Aware' 
    ) VSR
    ON  VSR.RespondentID = VR.RespondentID     
于 2013-06-10T11:40:32.417 回答
1
  • JOIN 会增加行数,因为它是“Equi join”
  • IN(和 EXISTS)不会乘以行,因为这些是“半连接”

无论哪种方式,您可能都需要合适的索引

  • 垂直响应,(响应者 ID)
  • 垂直堆叠响应,(问题,响应者 ID)

有关更多信息,请参阅在 SQL 语句中将“IN”与子查询一起使用

于 2013-06-10T11:40:32.757 回答
1

问题可能与重复有关。尝试这个:

SELECT sum(VR.Weight) 
FROM verticalresponses VR inner join
     (select distinct RespondentID
      from verticalstackedresponses VSR
      where SR.Question = 'Brand Aware'
     ) vsr
     ON VSR.RespondentID = VR.RespondentID;

你想要一个,inner join因为你想过滤VR表。Aleft join会将所有内容保留在第一个表中。

于 2013-06-10T11:41:44.403 回答