SQL - 用JOIN替换慢“IN”语句

时间:2013-06-10 11:31:09

标签: sql performance

根据主题 - 我试图用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' 

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

3 个答案:

答案 0 :(得分:2)

子查询

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

可能会为任何RespondentID返回多行,然后在连接和版本之间会得到不同的结果

根据这一点,可能会产生相同的结果

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

答案 1 :(得分:1)

  • JOIN将乘以行,因为它是“Equi join”
  • IN(和EXISTS)不会乘以行,因为它们是“半连接”

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

  • verticalresponses,(RespondentID)
  • verticalstackedresponses,(问题,RespondentID)

有关详情,请参阅Using 'IN' with a sub-query in SQL Statements

答案 2 :(得分: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表。 left join会将所有内容保留在第一个表格中。