这是我的查询
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)
但是这个查询提供了错误的输出,因为我有很多行,它们在所有三个连接列中都有记录。有没有其他方法可以实现相同的目标?
答案 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条消息等......)
(查询计划可能很有趣)