在单个查询中将一个表的多个列连接到另一个表的单个列

时间:2014-10-30 11:17:25

标签: sql sql-server join

这是我的查询

select u.FirstName as AssignedBy, u1.FirstName as RespondedBy, u2.FirstName as ClosedBy
from Messages M
left join User u on isnull(M.AssignedBy, 0) = u.UserId    
left join User u1 on isnull(M.RespondedBy, 0) = u1.UserId
left join User u2 on isnull(M.closedby, 0) = u2.UserId

是否可以在单个查询中编写连接?我想提高查询的性能,所以我不想进行3次连接,所以在单个连接中尝试它,因为我的User表有很多记录。我在两个表上都有所有索引。我试过了

select u.FirstName as AssignedBy, u.FirstName as RespondedBy, u.FirstName as ClosedBy
from Messages M
left join User u on 
(isnull(M.AssignedBy, 0) = u.UserId or isnull(M.RespondedBy, 0) = u.UserId or isnull(M.closedby, 0) = u.UserId)

但是这个查询提供了错误的输出,因为我有很多行,它们在所有三个连接列中都有记录。有没有其他方法可以实现相同的目标?

2 个答案:

答案 0 :(得分:1)

您的原始查询看起来很好。如果您的索引位于User(UserId)或更好User(UserId, FirstName),那么我认为效果会很好。

or条件下使用join通常会使性能变差而不是更好。

您的问题可能很简单,就是Messages表的大小。返回非常大的结果集可能需要一段时间。

答案 1 :(得分:1)

我认为没有“更好”的方法来做到这一点。我唯一建议反对的是ISNULL()中的JOIN构造,因为它实际上并没有用于任何目的,但可能会使优化器混淆。 查询原样“要求”你在User表上有一个正确的索引,但我假设UserId字段已经是所述表的PK ...

select u.FirstName as AssignedBy, 
       u1.FirstName as RespondedBy, 
       u2.FirstName as ClosedBy
from Messages M
left join User u on M.AssignedBy = u.UserId    
left join User u1 on M.RespondedBy = u1.UserId
left join User u2 on M.closedby = u2.UserId

表现有多糟糕?你确定用户表的链接是罪魁祸首吗? (我猜你也通过在Messages表上设置其他谓词来限制查询的结果;例如,只想要打开消息,或者最后100条消息等......)

(查询计划可能很有趣)