0

私は4つのテーブルを持っています

  • Customers- PK:CustomerID
  • Events- PK:EventID
  • Customers_Events- 2 つの FK を含むテーブルを結合CustomerIDし、EventID
  • Customer_Checkins- タイムスタンプ列 ( CheckinDateTime) と FK 参照を含むCustomerID

このような出力が欲しい

CustomerName   EventName    CheckinDateTime
------------   ----------   ---------------
Peter          Christmas    2012-12-25 00:27:48.350
Peter          Valentines   2013-02-14 01:19:36.113
Peter          Spring       2013-05-20 02:13:53.710

問題は、代わりにこの結果が得られることです

CustomerName   EventName    CheckinDateTime
------------   ----------   ---------------
Peter          Christmas    2012-12-25 00:27:48.350
Peter          Christmas    2013-02-14 01:19:36.113
Peter          Christmas    2013-05-20 02:13:53.710
Peter          Valentines   2012-12-25 00:27:48.350
Peter          Valentines   2013-02-14 01:19:36.113
Peter          Valentines   2013-05-20 02:13:53.710
Peter          Spring       2012-12-25 00:27:48.350
Peter          Spring       2013-02-14 01:19:36.113
Peter          Spring       2013-05-20 02:13:53.710

有効な各レコードが 3 回返されます

これは、上記の結果を得るために使用するスクリプトです

SELECT DISTINCT 
    Customers.Firstname, Events.EventName, CustomerCheckins.CheckinDateTime
FROM         
    CustomerCheckins 
INNER JOIN
    Customers_Events ON CustomerCheckins.CustomerID = Customers_Events.CustomerID 
LEFT OUTER JOIN
    Customers ON Customers_Events.CustomerID = Customers.CustomerID 
RIGHT OUTER JOIN
    Events ON Customers_Events.EventID = Events.EventID
WHERE     
    (Customers_Events.CustomerID = 1887)

この問題を解決するための助けをいただければ幸いです。スクリプトのすべての組み合わせを試したと思います。

4

2 に答える 2

1

問題はデータベースの設計にあります。

データ モデルでは、チェックインを特定のイベントにリンクすることはできません。

Event テーブルに startdate と enddate が含まれている場合、問題は解決可能です。次に、結合に時間制約を追加できます。

編集:

幸いなことに、イベント テーブルに startdate と endate があったため、次の SQL が機能するはずです。

          SELECT Customers.Firstname, Events.EventName, MAX(CustomerCheckins.CheckinDateTime)
            FROM CustomerCheckins 
      INNER JOIN Customers_Events 
              ON CustomerCheckins.CustomerID = Customers_Events.CustomerID 
 LEFT OUTER JOIN Customers 
              ON Customers_Events.CustomerID = Customers.CustomerID 
RIGHT OUTER JOIN Events 
              ON Customers_Events.EventID = Events.EventID
             AND events.StartDateTime <= CustomerCheckins.CheckinDateTime
             AND Events.EndDateTime > CustomerCheckins.CheckinDateTime
           WHERE (Customers_Events.CustomerID = 1887)
        GROUP BY Customers.Firstname, Events.EventName

ユーザーがイベント中に複数回チェックインした場合に備えて、group by が必要であることに注意してください。

checkindate の MIN または MAX の選択は、イベント中に最初のチェックインを表示するか、最後のチェックインを表示するかによって異なります。

サイドノート:

私は SQL Server のクエリ オプティマイザーにあまり詳しくありませんが、このクエリの適切な実行プランを作成するのは難しいかもしれません。ライブ システムで使用する予定がある場合は、テーブルに大量のデータをロードした後、必ずテストしてください。

于 2013-10-18T10:32:57.397 に答える