2014-10-30 42 views
0

这是我的查询加入一个表的多个列到另一个表的单个列单查询

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个连接在单个连接中尝试,因为我的用户表有很多记录。我有两个表上的所有索引。我试图

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

你的表现有多糟糕?你可以用查询的执行计划编辑你的问题吗? – 2014-10-30 11:20:29

回答

1

您的原始查询看起来很好。如果你有User(UserId)或更好的指数User(UserId, FirstName)那么我会认为表现会很好。

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

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

+0

是戈登,我的桌子确实很大,但我不能帮助它,所以试图优化其他查询。我有UserId上的索引。 – Hitesh 2014-10-30 11:41:17

1

我不认为有一个'更好'的方法来做到这一点。我建议的唯一的建议是在JOIN中构建ISNULL(),因为它并没有真正起到任何作用,但可能会混淆优化器。 查询,因为它是不“需要”,你对用户表适当的索引,但我假设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个消息等等......)

(查询计划可能很有趣)

+0

我不确定用户表是罪魁祸首,在消息表中有大量数据。我限制了查询的结果,也有很多过滤结果的条件,但我想知道我可以指定查询的这一部分吗? – Hitesh 2014-10-30 11:44:56

+0

在这种情况下,我只是首先关注'其他'条件; (三)加入到用户表看起来好,因为它是恕我直言。就像我所说的,查看查询执行计划并查看“重”部分的位置。 – deroby 2014-10-30 12:07:45

+0

好的,非常感谢您的时间deroby – Hitesh 2014-10-30 12:09:32

相关问题