如何避免重复表的合并

时间:2016-08-08 07:14:54

标签: sql sql-server azure-sql-database

我有以下数据库结构:

tblShelter
ShelterId
PetId
客户端Id
ShelterName
地址

tblClient
客户端Id
PetId

tblPet
PetId
PetName

因此,宠物可以属于庇护所或注册庇护所客户(被收养的宠物)。

所以我的Shelter表有如下数据:

ShelterId  PetId ClientId ShelterName 
    1       100    NULL       Test
    1       NULL   101        Test   
    1       102    NULL       Test   

所以,我需要为每个避难所(直接庇护所宠物或客户)获取所有宠物名称

这是我的疑问:

Select Coalesce(p.PetName, pclient.PetName) as PetName 
from tblShelter s
Left Join tblPet p
on p.PetId = s.PetId   
Left Join (select p2.PetId, p2.PetName 
           from tblClient c 
           join tblPet p2 
           on c.PetId = p2.PetId) pclient 
on s.PetId = pclient.PetId
where shelterId=1

问题:是否可以优化此查询?目前,它看起来并不漂亮。请注意,为简单起见,显示了数据库结构。不幸的是,它无法修改。是否有可能以聪明的方式摆脱合并或摆脱子查询?

1 个答案:

答案 0 :(得分:1)

是 - 更改您的JOIN订单:

Select p.PetName 
from tblShelter s
Left Join tblClient c
    on s.ClientId = c.ClientId
inner join tblPet p
    on p.PetId = s.PetId or
       p.PetId = c.PetId
where shelterId=1

JOIN并非严格基于连接两个表 - ON子句可以引用已加入的任何表,以形成当前连接的任一侧。因此,我们允许tblPet的加入基于直接引用(通过s.PetId)或通过tblClient中的可选联接。

当然,您可以通过为ON加入更明智的tblPet条件来进一步简化上述查询 - 但这样做的方法是重新引入您正在寻求的功能避免 - COALESCE。我不知道你寻求避免这个功能的原因是什么。