我目前正在课堂上学习左右联接。在处理一对一或一对多表时,这很有意义,但我无法弄清多对多关系。 我应该显示一个高尔夫球手每年筹集多少钱的列表,即使该数字为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
答案 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
以获得该表中的其他信息。
由于这是一个作业问题,我将让您完成查询。