门票持续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,但每次我尝试它都会出错。任何帮助将不胜感激!感谢。
答案 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);
注意(没有双关语):如果一张票有多个音符,那么你将在输出中获得多行。