用于在内部联接中返回不同值的选项

时间:2014-04-24 19:45:57

标签: sql join distinct

我有两张桌子。

表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行,那么我的原始查询将需要一段时间。

该人特别希望我使用内部联接...

1 个答案:

答案 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使用速度更快的版本。