在SQL中正确使用左右联接

时间:2018-11-30 21:24:10

标签: sql sql-server join left-join right-join

我目前正在课堂上学习左右联接。在处理一对一或一对多表时,这很有意义,但我无法弄清多对多关系。 我应该显示一个高尔夫球手每年筹集多少钱的列表,即使该数字为0。因此,我应该显示所有3年中的5个高尔夫球手,总共15行。无论我做左组合,右组合还是全组合,我都只会得到TEventGolfers表的结果。

INSERT INTO TEvents ( intEventID, strEventDate )
VALUES   ( 1, '2015' )
        ,( 2, '2016' )
        ,( 3, '2017' )

INSERT INTO TGolfers( intGolferID, strFirstName, strLastName )
VALUES   ( 1, 'Trevor', 'Duplin')
        ,( 2, 'Jay', 'Graue')
        ,( 3, 'Mary', 'Beimesch')
        ,( 4, 'Tony', 'Hardan')
        ,( 5, 'Iwana', 'Bucks')

INSERT INTO TEventGolfers ( intEventGolferID, intEventID, intGolferID ) 
VALUES   (1, 1, 1)
        ,(2, 1, 2)
        ,(3, 1, 3)
        ,(4, 2, 4)
        ,(5, 2, 5)
        ,(6, 2, 1)
        ,(7, 3, 2)
        ,(8, 3, 3)
        ,(9, 3, 5)

INSERT INTO TEventGolferSponsors( intEventGolferSponsorID, intEventGolferID, intSponsorID, monPledgeAmount) 
VALUES   (1, 1, 1, 160.00)
        ,(2, 1, 1, 200.50)
        ,(3, 1, 2, 100.25)
        ,(4, 1, 3, 20.00)
        ,(5, 1, 4, 1500.00)
        ,(6, 1, 5, 220.20)
        ,(7, 1, 6, 120.00)
        ,(8, 1, 7, 2550.00)
        ,(9, 1, 1, 100.50)
        ,(10, 1, 2, 70.25)
        ,(11, 1, 3, 20.00)
        ,(12, 1, 4, 250.00)
        ,(13, 1, 5, 60.20)
        ,(14, 1, 6, 50.00)
        ,(15, 1, 7, 250.00)

-- Select Statements
SELECT TE.strEventDate, TG.strFirstName, ISNULL(SUM(TEGS.monPledgeAmount), 0) AS AmountRaised
FROM TGolfers AS TG

JOIN TEventGolfers AS TEG
ON TEG.intGolferID = TG.intGolferID

JOIN TEvents AS TE
ON TEG.intEventID = TE.intEventID

JOIN TEventGolferSponsors AS TEGS
ON TEGS.intEventGolferID = TEG.intEventGolferID

GROUP BY TG.strFirstName, TE.strEventDate
ORDER BY TE.strEventDate

1 个答案:

答案 0 :(得分:3)

这是一个CROSS JOIN问题,而不是外部联接问题。首先,您想使用CROSS JOIN生成高尔夫球手和年龄的所有组合。然后使用LEFT JOIN返回结果。

要了解我的意思,请运行以下查询:

select e.strEventDate, g.strFirstName, g.strLastName
from tevents e cross join
     tgolfers g;

您将看到结果集具有所需的所有行-但并非所有列。接下来,您可以将LEFT JOIN添加到TEventGolfers以获得该表中的其他信息。

由于这是一个作业问题,我将让您完成查询。