结合SQL中两个JOINS的结果

时间:2013-10-29 13:54:55

标签: sql sql-server tsql join

门票持续24小时,可以是“儿童”,“成人”或“青少年”。从本质上讲,一张票可以'连接到'一些电影。例如,儿童票将连接到年龄等级为PG或以下的电影,而成人票将连接到每部电影。

以下内容返回上个月为电影购买的所有门票的信息:

SELECT *
FROM 
[Test_DB].[dbo].[Tickets]
INNER JOIN 
[Test_DB].[dbo].[Movies]
ON 
[Test_DB].[dbo].[Tickets].[ConnectedTo] = [Test_DB].[dbo].[Movies].[MovieID]
WHERE 
[Test_DB].[dbo].[Tickets].[DateEntered] >= DATEADD(month, DATEDIFF(month, 0, GETDATE())-1, 0) AND [Test_DB].[dbo].[Tickets].[DateEntered] <= DATEADD(month, DATEDIFF(month, 0, GETDATE()), -1)

每张票可以附加任意数量的票据。例如,如果对持票人给予特别折扣,则会创建一个关于该票据的注释。同样,如果票证被换成另一张票或退款,则会创建一张票据。

以下内容将根据TicketID返回给定Ticket的所有注释:

SELECT *
FROM 
[Test_DB].[dbo].[Tickets]
JOIN [Test_DB].[dbo].[Notes]
ON [Test_DB].[dbo].[Tickets].[TicketID] = [Test_DB].[dbo].[Notes].[ConnectedTo]
WHERE TicketId = 64903

我的问题是,有没有办法将两者结合起来?例如,SQL的第一个位可以返回5个票证,每个票证具有不同的TicketID。基于此,我想利用我的第二个SQL来返回这5张票的所有注释。

我正在考虑使用UNION来结合两个选择...虽然我的大脑一直告诉我我需要在TicketId上加入两个SQL,但每次我尝试它都会出错。任何帮助将不胜感激!感谢。

2 个答案:

答案 0 :(得分:1)

这应该有效

SELECT [Test_DB].[dbo].[Tickets].*, [Test_DB].[dbo].[Notes].*
FROM [Test_DB].[dbo].[Tickets]
INNER JOIN [Test_DB].[dbo].[Movies]
ON 
[Test_DB].[dbo].[Tickets].[ConnectedTo] = [Test_DB].[dbo].[Movies].[MovieID]
INNER JOIN [Test_DB].[dbo].[Notes]
ON [Test_DB].[dbo].[Tickets].[TicketID] = [Test_DB].[dbo].[Notes].[ConnectedTo]
WHERE [Test_DB].[dbo].[Tickets].[DateEntered] >= DATEADD(month, DATEDIFF(month, 0, GETDATE())-1, 0) 
  AND [Test_DB].[dbo].[Tickets].[DateEntered] <= DATEADD(month, DATEDIFF(month, 0, GETDATE()), -1)

答案 1 :(得分:1)

我想“笔记”可以是可选的。如果是这样,那么您需要left join而不是inner join。此外,使用别名和消除不必要的方括号将使您的查询更容易阅读:

SELECT *
FROM Test_DB.dbo.Tickets t INNER JOIN 
     Test_DB.dbo.Movies m
     ON t.ConnectedTo = m.MovieID LEFT JOIN
     Test_DB.dbo.Notes n
     ON t.TicketID = n.ConnectedTo
WHERE t.DateEntered >= DATEADD(month, DATEDIFF(month, 0, GETDATE()) -1, 0) AND
      t.DateEntered <= DATEADD(month, DATEDIFF(month, 0, GETDATE()), -1);

注意(没有双关语):如果一张票有多个音符,那么你将在输出中获得多行。