2017-01-27 25 views
3

我有3個表...SQL服務器:連接表結果不包含空值(我想要它)

人:

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 
+0

INNER JOIN在OUTER JOIN刪除NULL值後執行。 –

回答

1

你應INNER JOINPerson表到PLEDGES,過濾掉任何w何甚至沒有承諾。然後做一個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中至多有一個條目。

+0

這導致了所需的數據。感謝您詳細解釋解決方案。如果我再次發帖,我肯定會美化我的SQL和表... ... – unknown6708

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 
+0

'與那些已經承諾要列出的人......這意味着他不想'左連接'人桌,或者,如果你這樣做,那麼你需要添加一個'WHERE'條件來刪除未認捐的人。 –