我有以下数据库结构:
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
问题:是否可以优化此查询?目前,它看起来并不漂亮。请注意,为简单起见,显示了数据库结构。不幸的是,它无法修改。是否有可能以聪明的方式摆脱合并或摆脱子查询?
答案 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
。我不知道你寻求避免这个功能的原因是什么。