从子查询中选择两次

时间:2014-10-17 19:32:55

标签: sql sql-server-2008 sql-server-2008r2-express

我的TableA有userAId和UserBId。

我还有另一个带UserId的TableB

我想从TableA中选择userAId和UserBId在tableB中的所有记录

我的解决方案是:

select * from TableA where 
  userAId IN
  (
  select UserId from Table B
  )

  and UserBId IN
  (
  select UserId from Table B
  )

但我认为它不是最佳解决方案,因为我从表B中选择两次UserId

还有其他解决方案吗?

我正在使用t-sql sql seerver 2008 R2

5 个答案:

答案 0 :(得分:2)

也许是这样的:

select * from TableA a where (
    select count(DISTINCT UserID) from TableB where UserID in (a.UserAId, a.UserBId)
) = 2

更新:我已将Count(*)更改为Count(DISTINCT UserID),如@Thorsten Kettner所述

答案 1 :(得分:1)

您自己的解决方案在第一眼看上去可能看起来有点过于复杂,但它可能是最好和最有效的方法。如果tableB.userId上有索引,则访问速度很快。

如果访问速度太慢,那么你可以通过在tableA(userAId,userBId)上提供索引来加快速度。

继续查询。它很容易阅读,做它应该做的事情并快速完成。

答案 2 :(得分:0)

而不是IN子句,与tableB进行两次JOIN会更快 您可以将其与

上的执行计划进行比较
select A.* from TableA A 
join TableB B1
on A.userAID  = B1.UserId
join TableB B2
AND A.userBId = B2.userID

答案 3 :(得分:0)

如果表b中的数据较少,则只能使用cte。如果你的查询给你你想要的东西,那么它就不能在join中转换,因为join会一对一匹配,即tableA的一条记录将匹配tableB的一个加入条件/条件,但是你在这里匹配一个用户ID和所有类似UserBId与所有。

;WITH cte_usrId(UserId)
 AS (SELECT UserId
     FROM   TableB)
SELECT *
FROM   TableA
WHERE  userAId IN (SELECT UserId
                   FROM   cte_usrId)
       AND UserBId IN (SELECT UserId
                       FROM   cte_usrId) 

答案 4 :(得分:0)

试试这个

SELECT *
FROM   TableA a
WHERE  EXISTS (SELECT 1
               FROM   table b
               WHERE  a.userAId = b.userid
                      AND a.UserBId = b.userid)