0

チケットは 24 時間有効で、「子供」、「大人」、または「ティーン」のいずれかになります。基本的に、チケットは多数の映画に「ConnectedTo」することができます。たとえば、子供のチケットは年齢制限が 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 に基づいて特定のチケットのすべてのメモを返します。

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

私の質問は、2 つを組み合わせる方法はありますか? たとえば、SQL の最初のビットは、それぞれが異なる TicketID を持つ 5 つのチケットを返す可能性があります。それに基づいて、2 番目の SQL を使用して、これら 5 つのチケットのすべてのメモを返したいと考えています。

UNION を使用して 2 つの選択を結合することを考えていました...私の脳は、TicketId で 2 つの SQL を結合する必要があると言い続けていますが、試行するたびに間違ってしまいます。どんな助けでも大歓迎です!ありがとう。

4

2 に答える 2

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);

注 (しゃれは意図されていません): チケットに複数のメモがある場合、出力に複数の行が表示されます。

于 2013-10-29T14:15:59.877 に答える