在这种情况下如何应用内连接?

时间:2015-11-11 09:56:59

标签: sql sql-server sql-server-2008 tsql

我编写了一个存储过程,我的表包含来自同一个表的两个外键DISTRICTS

情景:我正在传递一个人的工作记录,该记录应该包含他最初的工作城市和地区,然后是当前的城市和地区。现在我想显示两者的区域名称,但我在连接中感到困惑,因为它从相同的区域表中选择数据

存储过程:

select 
    ServiceInfo.pk_ServiceInfo_ServiceInfoID, 
    ServiceInfo.fk_Districts_ServiceInfo_CurrentDistrictID,
    ServiceInfo.fk_Districts_ServiceInfo_InitialDistrictID,
    Districts.DistrictName
from 
    ServiceInfo
join 
    Districts on Districts.pk_Districts_DistrictID = ServiceInfo.fk_Districts_ServiceInfo_CurrentDistrictID
join 
    PersonalInfo on PersonalInfo.pk_PersonalInfo_ID = ServiceInfo.fk_PersonalInfo_ServiceInfo_PID

3 个答案:

答案 0 :(得分:1)

我认为你需要第二次加入地区牌桌。与工作城市一起加入一次,加入当前城市一次。试试这个:

select 
    ServiceInfo.pk_ServiceInfo_ServiceInfoID, 
    ServiceInfo.fk_Districts_ServiceInfo_CurrentDistrictID,
    currentdistrict.DistrictName,
    ServiceInfo.fk_Districts_ServiceInfo_InitialDistrictID,
    initialdistrict.DistrictName
from 
    ServiceInfo
join 
    Districts currentdistrict on Districts.pk_Districts_DistrictID = ServiceInfo.fk_Districts_ServiceInfo_CurrentDistrictID
join 
    Districts initialdistrict on Districts.pk_Districts_DistrictID = ServiceInfo.fk_Districts_ServiceInfo_InitialDistrictID
join 
    PersonalInfo on PersonalInfo.pk_PersonalInfo_ID = ServiceInfo.fk_PersonalInfo_ServiceInfo_PID

您会注意到我如何使用分区表的表别名来显示哪个versin正在查找当前,以及哪个版本正在查找初始值。

答案 1 :(得分:1)

尝试以下方法:

select s.pk_ServiceInfo_ServiceInfoID, 
       s.fk_Districts_ServiceInfo_CurrentDistrictID,
       s.fk_Districts_ServiceInfo_InitialDistrictID,
       d1.DistrictName as CurrentDistrictName,
       d2.DistrictName as InitialDistrictName
from ServiceInfo si 
     join PersonalInfo p on p.pk_PersonalInfo_ID = s.fk_PersonalInfo_ServiceInfo
     join Districts d1 on d1.pk_Districts_DistrictID = s.fk_Districts_ServiceInfo_CurrentDistrictID 
     join Districts d2 on d2.pk_Districts_DistrictID = s.fk_Districts_ServiceInfo_InitialDistrictID

请注意,我在每个表上都使用了别名,并确保每个地方都使用了表名,包括联接的ON部分。

根据您的具体情况,您可能希望将表的连接设为LEFT OUTER JOIN。如果您希望查看 ServiceInfo 和/或 PersonalInfo 表格中的信息,即使区域表中没有记录两个外键字段中的值。目前,如果某个人/服务缺少任何外键,则不会返回任何记录。

答案 2 :(得分:0)

这就是你使用别名的方法。

SELECT s.pk_ServiceInfo_ServiceInfoID,
       s.fk_Districts_ServiceInfo_CurrentDistrictID, 
       s.fk_Districts_ServiceInfo_InitialDistrictID,
       d.DistrictName
FROM ServiceInfo s
JOIN Districts d
ON d.pk_Districts_DistrictID = s.fk_Districts_ServiceInfo_CurrentDistrictID
JOIN PersonalInfo p
ON p.pk_PersonalInfo_ID= s.fk_PersonalInfo_ServiceInfo_PID

您是否必须以某种方式修改查询,或者您只是想更轻松地阅读?

相关问题