当我需要在不同的列上引用相同的数据时,我总是使用多个连接。像这样:
select
a.ContactName
,b.ContactName
,c.ContactName
from
OrderBase as o
left join ContactBase as a on o.contactid1 = a.ContactId
left join ContactBase as b on o.contactid2 = b.ContactId
left join ContactBase as c on o.contactid3 = c.ContactId
我一直认为这是非常低效的。加载表3次进行3次查找。有没有更有效的方法来做到这一点?我不是指编写代码,而是使用资源。 在SQL服务器的更高版本中是否有任何好的工具可以解决这个问题?
答案 0 :(得分:1)
第一个评论是存储相同的值是多列通常是一个可疑的模式。通常,这样的数据结构可以使用每个" OrderBase"一个" ContactId"。联结表并不总是最好的解决方案,但通常是。
至于你的查询:
select a.ContactName, b.ContactName, c.ContactName
from OrderBase as o left join
ContactBase a
on o.contactid1 = a.ContactId left join
ContactBase b
on o.contactid2 = b.ContactId left join
ContactBase c
on o.contactid3 = c.ContactId;
这特别需要ContractBase(ContactId, ContactName)
上的索引。为此目的使用left join
是完全合理的。
使用此索引,查询甚至不需要原始数据页面,因为索引"涵盖"查询 - 查询中的所有列都在索引中。您不必担心多次加载索引。虽然索引(或表)逻辑加载了三次,但称为页面缓存的东西可能会将页面保留在内存中,因此后续加载将非常快。