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
使用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
请注意,我不得不添加别名(ta1
和ta2
)为两个E_Tag_Attributes
连接,以防止查询中的歧义,因为这两个表的名称是相同的。
您可能想要考虑的另一个选项是使用IN()
查询,但使用GROUP BY AssociateID
,并添加WHERE
子句,例如COUNT(TagId)=2
。这将过滤结果,以便只包含结果集中包含两个标签的结果。
但我可以传递一大堆tagIDs是否没有比使用AND更干净的方式来做到这一点? – 2011-05-06 11:16:33
您也可以使用IN,GROUP BY并使用count(..)= TAG_COUNT进行过滤。 – 2011-05-06 11:17:29