【问题标题】:options for returning distinct values across an inner join通过内部连接返回不同值的选项
【发布时间】:2014-04-24 19:45:57
【问题描述】:

我有两张桌子。

表 A 包含用户 ID、用户名

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

这个人特别希望我使用内部连接...

【问题讨论】:

  • “在我的查询中,仅查看 distict B.ClientName”是什么意思?您没有在结果中返回 ClientName 是吗?在这种情况下,这意味着什么?

标签: sql join distinct


【解决方案1】:

您的原始查询是:

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

【讨论】:

  • 这是另一种方式,但是使用内连接呢?这就是他们所要求的,我必须弄清楚如何......
  • @MichaelHarness 。 . .如果表a 中的每个id 在表b 中都有很多匹配项,那么内部连接确实需要很长时间。为什么有人告诉你如何编写查询(以及为什么他们似乎是错误的)?
  • 我不知道他们是否只是在测试我,或者这是否是他们真正想要的。这是我的老板今天在工作中向我提出的一个问题,我无法在互联网上找到任何与此相关的内容。实际上,在我对同一个人进行一些研究后不久,我会问第二个不相关的问题。
  • @MichaelHarness 。 . . join 可以在 b 上使用相同的索引,而 a 中每个 id 的匹配项很少(最多几十个)。如果您有很多(数千个或更多),那么将花费大量额外时间来处理distinct。这就是为什么exists 更好。
猜你喜欢
  • 1970-01-01
  • 2021-05-26
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
  • 2017-10-08
相关资源
最近更新 更多