我的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
答案 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)