SQL Server:连接表结果不包含空值(我希望它)

时间:2017-01-27 03:07:12

标签: sql sql-server-2008

我有3张桌子......

人:

PersonID   FirstName   LastName
-------------------------------
   2       Jim         Smith
   4       David       Dill
   5       Sarah       Hill
   6       Eric        Ericson

服务承诺:

PersonID   Amount   Year
------------------------
   4        1000    2017
   5        1000    2017
   6        1000    2017

内容:

PersonID  TotalToPresent  Year
------------------------------
   4          200         2017
   5          400         2017

我想和那些已经承诺上市的人一起参加这些表,尽管没有给出。

结果:

PersonID    Pledge    TotalToPresent  Year
------------------------------------------
   4         1000          200        2017
   5         1000          400        2017
   6         1000      NULL (or zero) 2017

但是,我的结果表从未包括任何未给出的人(不在贡献表中)

我的查询:

SELECT 
    Person.PersonID,
    PLEDGES.PledgeAmount,
    PLEDGES.ContributionYear,
    Person.LastName,
    Person.FirstName,
    Person.PrimaryAssociationID,
    Contributions.TotalContrib
FROM 
    PLEDGES
INNER JOIN 
    (Contributions 
LEFT JOIN 
    Person ON Contributions.PersonID = Person.PersonID) 
    ON PLEDGES.PersonID = Person.PersonID 
FROM 
    PLEDGES 
INNER JOIN 
    Person ON PLEDGES.PersonID = Person.PersonID 
INNER JOIN 
    Contributions ON Person.PersonID = Contributions.PersonID 
WHERE  
    PLEDGES.Year = '2017' 
ORDER BY 
    Person.PersonID

2 个答案:

答案 0 :(得分:1)

您应该INNER JOIN Person表格PLEDGES来过滤掉任何甚至没有承诺过的人。然后执行LEFT JOINContributions,可能包含一个人所做贡献的信息,而不仅仅是承诺。

SELECT t1.PersonID,
       t2.PledgeAmount,
       t2.ContributionYear,
       t1.LastName,
       t1.FirstName,
       t1.PrimaryAssociationID,
       COALESCE(t3.TotalContrib, 0.0) AS TotalContrib
FROM Person
INNER JOIN PLEDGES t2
    ON t1.PersonID = t2.PersonID
LEFT JOIN Contributions t3
    ON t1.PersonID = t3.PersonID

请注意,如果您的数据可能超过一年,您可能还希望使用年份加入PLEDGESContributions。我在答案中假设某个人在PLEDGESContributions中最多只有一个条目。

答案 1 :(得分:0)

首先,将你的sql放在格式化程序/美化器中。它会让你的生活更轻松。

现在提出您的问题:内部联接意味着它只会显示匹配项。您正在寻找的是左连接。所以做这样的事情:

select
    *
from 
    table1 t1
    left join table2 t2
        t1.key = t2.foreign_key
    left join table3 t3
        t2.key = t3.foreign_key
order by
    whatever