2014-10-17 86 views
2

我有TableA with userAId和UserBId。从子查询中选择两次

我也得到了用户id另一个表B

我想选择表A的所有记录,其中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

回答

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指出IN子句的

+1

迄今唯一正确的答案并没有upvotes唯一的一个。难以置信。这里是我的+1。如果tableB中的一个用户可以有多个条目,那么应该是'COUNT(DISTINCT UserID)'。 – 2014-10-17 19:49:37

+0

该查询的速度与OP的尝试速度相似,在tableB上连接两次会快得多 – radar 2014-10-17 23:07:24

0

相反,与表B连接两次会更快 您可以将其与执行计划进行比较

select A.* from TableA A 
join TableB B1 
on A.userAID = B1.UserId 
join TableB B2 
AND A.userBId = B2.userID 
+0

奇怪地看到upvotes为此。您的查询正在查找tableB中的一条记录,其中userID与userAId和userBId都匹配。这与要求的内容相距甚远。 – 2014-10-17 19:45:55

+0

是的,你的不这样做。如果userAId为'A'且userBId为'B'并且两个用户都存在于tableB中,那么您的查询仍然找不到它,因为它正在查找一个tableB记录,其中UserId同时为'A'和'B' ,这是不可能的。您的陈述仅适用于userAId = userBId的记录。 – 2014-10-17 19:52:50

+0

@Thorsten Kettner,+1指出,做两次连接会比我的状态更快 – radar 2014-10-17 20:11:03

0

如果表b中的数据较少,则只能使用cte。如果你的查询给了你想要的东西,那么它不能在连接中转换,因为连接将会一对一地匹配,即tableA的一个记录将匹配tableB的一个关于连接条件/条件的记录,但是在这里你将一个userAID与所有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) 
1

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

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

留在您的查询。它很容易阅读,做它应该做的事,并且做得很快。

0

试试这个

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