我有两张桌子。
表A包含UserID,UserName
表B包含ID,FK_UserID,ClientName
我需要返回一个不同的A.UserName列表,其中A.Username存在于表B中,并且至少有一个ClientName附加到它们,但在我的查询中,只查看不同的B.ClientName。
我的想法是:
Select Distinct A.UserName from A as A
Inner Join B as B
on A.UserID = B.FK_UserID
但这仅限于表A
我的下一个想法是:
Select Distinct Username from A
where UserID In
(
Select FK_UserID, distinct ClientName from B)
我被告知有一种方法可以在连接中的两个表上执行不同的操作,因为如果表A是300行,而表B是3个BILLION行,那么我的原始查询将需要一段时间。
该人特别希望我使用内部联接...
答案 0 :(得分:2)
您的原始查询是:
Select Distinct A.UserName
from A as A Inner Join
B as B
on A.UserID = B.FK_UserID;
如果b
中有多个匹配项,则可能会出现问题。使用in
并不是一个非常正确的解决方案。相反,请使用exists
:
select a.UserName
from a
where exists (select 1
from b
where b.fk_UserID = a.UserId
)
然后,请确保您在b(fk_UserId)
上有索引。
这应该在索引中执行大约300次查找。那应该很快。
对于告诉您使用内部联接的人的建议:为该人写一个特殊版本。对于运行所需的几分钟或几小时,让其他人使用exists
使用速度更快的版本。