【问题标题】:SQL join one table against multiple columnsSQL 将一张表与多列连接起来
【发布时间】:2016-10-05 10:41:48
【问题描述】:

我的数据库中有 2 个表

1) 报告表

 AppNo AppName AddedBy AssignedTo ModifiedBy
 -------------------------------------------
    1   App1       1        2           1      
    2   App2       1        2           2
    3   App3       2        2           2
    4   App4       1        2           3

2) 用户表

   UserId  UserName Role
   ----------------------
    1     Raj      Manager
    2     Sid      Lead
    3     KK       Rep

所以我想加入两个表,这样我就可以用名字代替 ID

需要结果:

  AppNo AppName AddedBy AssignedTo ModifiedBy
  -------------------------------------------
    1   App1     Raj      Sid          Raj      
    2   App2     Raj      Sid          Sid
    3   App3     Sid      Sid          Sid
    4   App4     Raj      Sid           KK

我的查询:

SELECT
R.AppNo, R.AppName,
u1.UserName as AddedBy,
u2.UserName as AssignedTo,
u3.UserName as ModifiedBy

FROM Report R

LEFT OUTER JOIN Users u1 on u1.UserID = R.AddedBy
LEFT OUTER JOIN Users u2 on u2.UserID = R.AssignedTo
LEFT OUTER JOIN Users u3 on u3.UserID = R.ModifiedBy

但我不想多次加入用户表..

在我的原始报告表中,有近 8 个 UserId 列,所以我不能加入 8 次,这会降低性能。

谁能推荐最好的方法。

注意:我无法更改表架构

提前致谢

【问题讨论】:

    标签: sql sql-server database join


    【解决方案1】:

    多次加入是唯一的方法;这就是数据和结构。

    应该没有性能问题,因为数据库通常经过精心设计来处理这个问题。仅仅因为 JOIN 对人类来说看起来很复杂并不意味着它对于优化器或数据库来说是复杂或昂贵的。

    【讨论】:

      【解决方案2】:

      您可以对列使用笛卡尔连接,但性能在很大程度上取决于表的索引程度...

      select R.AppNo,
             R.AppName,
             (select UserName from Users where UserID = R.AddedBy) as AddedBy,
             (select UserName from Users where UserID = R.AssignedTo) as AssignedTo,
             (select UserName from Users where UserID = R.ModifiedBy) as ModifiedBy
      from Report R
      

      【讨论】: