【问题标题】:select from subquery two times从子查询中选择两次
【发布时间】:2014-12-13 11:01:40
【问题描述】:

我有带有 userAId 和 UserBId 的 TableA。

我还有另一个带有 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 seserver 2008 R2

【问题讨论】:

    标签: sql sql-server-2008 sql-server-2008r2-express


    【解决方案1】:

    可能是这样的:

    select * from TableA a where (
        select count(DISTINCT UserID) from TableB where UserID in (a.UserAId, a.UserBId)
    ) = 2
    

    更新:如@Thorsten Kettner 所述,我将Count(*) 更改为Count(DISTINCT UserID)

    【讨论】:

    • 迄今为止唯一正确的答案,也是唯一没有投票的答案。极好的。这是我的+1。如果 tableB 中的一个用户可以有多个条目,则应该是 COUNT(DISTINCT UserID)
    • 此查询的速度与 OP 的尝试速度相似,在 tableB 上执行两次连接会快得多
    【解决方案2】:

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

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

    请继续查询。它易于阅读,做它应该做的事情并且做的很快。

    【讨论】:

      【解决方案3】:

      只有在表 b 中的数据较少时才能使用 cte。如果您的查询为您提供了您想要的,那么它无法在联接中转换,因为联接将一对一匹配,即表 A 的一条记录将在联接条件/条件上与表 B 的一条记录匹配,但在这里您将一个用户的 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) 
      

      【讨论】:

        【解决方案4】:

        代替 IN 子句,使用 tableB 执行两次 JOIN 会更快 您可以将其与执行计划进行比较

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

        【讨论】:

        • 奇怪地看到对此的支持。您的查询正在查找 tableB 中的一条记录,其中 userID 与 userAId 和 userBId 都匹配。这与所要求的相差甚远。
        • 是的,你的不这样做。如果 userAId 是 'A' 并且 userBId 是 'B' 并且两个用户都存在于 tableB 中,您的查询仍然找不到它,因为它正在寻找一个 tableB 记录,其中 UserId 是 'A' 和 'B' 同时,这是不可能的。您的语句仅适用于 userAId = userBId 的记录。
        • @Thorsten Kettner,+1 指出,做两次加入会比在条件下更快我瘦
        【解决方案5】:

        试试这个

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

        【讨论】:

          猜你喜欢
          • 2019-04-04
          • 2012-02-13
          • 2010-10-09
          • 2013-10-18
          • 2017-02-19
          • 2020-06-24
          • 2014-11-23
          • 2021-11-25
          • 1970-01-01
          相关资源
          最近更新 更多