0

门票有效期为 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,但是每次我尝试它都会出错。任何帮助将不胜感激!谢谢。

4

2 回答 2

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)
于 2013-10-29T13:58:27.687 回答
1

我想“笔记”可能是可选的。如果是这样,那么您将需要 aleft 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);

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

于 2013-10-29T14:15:59.877 回答