SQL IN()查询结果产生不需要的结果

问题描述:

如果可能,只需要一些帮助来优化此查询。SQL IN()查询结果产生不需要的结果

SELECT * 
FROM 
    E_Associates INNER JOIN E_Tag_Attributes ON E_Tag_Attributes.AssociateID = E_Associates.associateID 
WHERE 
    (TagID IN (524,546)) 
    AND CONTAINS ((AboutMe,WorkingStyle,Approach,MyValues),'werwer') 
    AND IsActive = 1 

基本上我有三个表...

E_associates这是一个接触的表名等等

E_Tag_Attributes这是E_tags表和E_associates之间的链接表。

我想这有两个TagID 524和546记录在E_Tag_Attributes

此查询仅显示用户不过是生产具有一个或两个结果...

很累,希望它的东西简单:)

在此先感谢。

的SQL IN()子句将通过OR结合而不是AND。

(...) WHERE A IN (1, 2, 3) 

相当于

(...) WHERE (A = 1 OR A = 2 OR A = 3) 

在这种情况下,你将不得不加入同一个表两次,移动在连接标准的标签识别条款:

SELECT * FROM E_Associates EA 
    INNER JOIN E_Tag_Attributes J1 ON J1.AssociateID = EA.associateID AND TagId = 524 
    INNER JOIN E_Tag_Attributes J2 ON J2.AssociateID = EA.associateID AND TagId = 526 
WHERE CONTAINS ((AboutMe,WorkingStyle,Approach,MyValues),'werwer') AND IsActive = 1 

我不知道如果WHERE子句将以这种方式工作。如果在E_Tag_Attributes表中定义了列,则可能会出现'模糊'列问题。如果是这种情况,只需将条款放入连接条件并放入J1即可。或J2。需要的地方。

假设你要谁拥有标签524和546所有员工:

SELECT * FROM E_Associates 
INNER JOIN E_Tag_Attributes e1 
    ON e1.AssociateID = E_Associates.associateID 
INNER JOIN E_Tag_Attributes e2 
    ON e2.AssociateID = E_Associates.associateID 
WHERE (e1.TagID IN (524)) AND CONTAINS ((AboutMe,WorkingStyle,Approach,MyValues),'werwer') 
AND (e2.TagID IN (546)) AND CONTAINS ((AboutMe,WorkingStyle,Approach,MyValues),'werwer') 
AND IsActive = 1 
+0

但我可以传递一大堆tagIDs是否没有比使用AND更干净的方式来做到这一点? – 2011-05-06 11:16:33

+1

您也可以使用IN,GROUP BY并使用count(..)= TAG_COUNT进行过滤。 – 2011-05-06 11:17:29

使用IN()子句指定应该查找具有任何一个指定值的记录。所以它会做你所描述的。

如果你只想找到那些有相关记录的这两个指定的值,你需要在连接中进行。

您可以将TagId字段添加到联接的ON子句中,与WHERE子句中的子句相同;仅仅因为它在ON子句中,它不会具有来指定直接链接到主表的字段。然而在这种情况下,在这里使用IN()将会产生与WHERE条款相同的效果,所以我们需要更进一步......

为了找到链接到每个个体E_Associates记录的值的,你将需要加入E_Tag_Attributes表两次:

SELECT * FROM E_Associates 
    INNER JOIN E_Tag_Attributes ta1 ON ta1.AssociateID = E_Associates.associateID AND ta1.TagId = 524 
    INNER JOIN E_Tag_Attributes ta2 ON ta2.AssociateID = E_Associates.associateID AND ta2.TagId = 526 
WHERE CONTAINS ((AboutMe,WorkingStyle,Approach,MyValues),'werwer') AND IsActive = 1 

请注意,我不得不添加别名(ta1ta2)为两个E_Tag_Attributes连接,以防止查询中的歧义,因为这两个表的名称是相同的。

您可能想要考虑的另一个选项是使用IN()查询,但使用GROUP BY AssociateID,并添加WHERE子句,例如COUNT(TagId)=2。这将过滤结果,以便只包含结果集中包含两个标签的结果。