2011-09-05 89 views
3

我有一个带有三个表的SQL Server数据库:Gang,GangMember和Neighborhood。这些表的结构是这样的:SQL - 使用左连接混合内连接

Neighborhood 
------------ 
ID (non-null) 
Name (non-null) 

Gang 
---- 
ID (non-null) 
Name (non-null) 
NeighborhoodID (nullable) 

GangMember 
---------- 
ID (non-null) 
GangID (non-null) 
Name (non-null), 
Position (nullable) 

我需要得到团伙成员所属的(是的,他们可以属于多个)所有帮派。如果有邻居,我也需要返回。我想我的结果设置为以下形式:gang.name,neighborhood.name,member.position

到目前为止,我在这里得到:

SELECT 
g.[Name], 
'' as 'Neighborhood' /* This what I don't know how to do */ 
m.[Position] 
FROM 
    [Gang] g, 
    [GangMember] m 
WHERE 
    m.[GangID]=g.[ID] 

因为帮派可能没有邻居,我不知道如何完成这个查询。有人可以帮我吗?谢谢!

+0

我觉得你有你的模型的一些更新异常等问题。我不认为你已经正确定义了一个帮派成员,例如“帮派成员属于(是的,他们可以属于多个)”似乎是矛盾的。也许你的意思是说,同一个人*可以是同一个帮派的成员?如果是这样,大概他们可以在不同的帮派中以不同的名字(或相同的名字)知道他们自己的保护。了解帮派之间的竞争传统和他们的反建立性质,我很难想象哪个代理机构会是团伙成员ID的可信赖来源! – onedaywhen

+0

澄清:我认为你的'GangMember'表需要分成两个表格:一个用于模拟人(可能有诸如法定名称,指纹,DNA等标识符),另一个用于建模人和她的帮派(难以想象任何标识符,而不是'已知'的名字)。 – onedaywhen

回答

5

试试这个:

SELECT 
    g.[Name], 
    n.[Name] as 'Neighborhood', 
    m.[Position] 
FROM 
    [Gang] g INNER JOIN [GangMember] m ON m.[GangID]=g.[ID] 
    LEFT OUTER JOIN [Neighborhood] n ON g.[NeighborhoodID] = n.[ID] 
1
select G.Name as GangName, 
     N.Name as Neighborhood, 
     GM.Name as MemberName, 
     GM.Position as MemberPosition 
from Gang as G 
    inner join GangMember as GM 
    on G.ID = GM.GangID 
    left outer join Neighborhood as N 
    on G.NeighborhoodID = N.ID 
0

你可以做左连接如下:

SELECT 
g.[Name], 
n.name as 'Neighborhood' /* This what I don't know how to do */ 
m.[Position] 
FROM 
    [Gang] g 
    INNER JOIN [GangMember] m ON m.[GangID]=g.[ID] 
    LEFT JOIN Neighborhood n ON n.Id = g.NeighborhoodID 
0
SELECT TOP (100) PERCENT 
    DemographicTable.Name, 
    ReferralTable.Code, 
    ReferralTable.Date_Termed, 
    ReferralTable.Referral_date, 
    (
     SELECT Date_Accepted 
     FROM CaseTable 
     WHERE (ReferralTable.ID = DemographicTable.ID_Number) 
      AND (Date_Accepted <> '') 
      AND (DateTermed > '2013-11-01' OR DateTermed = '') 
    ) AS Start, 
    (
     SELECT DateTermed 
     FROM CaseTable AS CaseTable_1 
     WHERE (ReferralTable.ID = DemographicTable.ID_Number) 
      AND (Date_Accepted <> '') 
      AND (DateTermed > '2013-11-01' OR DateTermed = '') 
    ) AS Term 
FROM ReferralTable 
INNER JOIN DemographicTable 
    ON ReferralTable.ID = DemographicTable.ID_Number 
    AND ReferralTable. Referral_date > '2012-12-01' 
    AND ReferralTable. Code = 'JTC' 
ORDER BY ReferralTable. Referral_date