【问题标题】:unable to join 3 tables in SQL无法在 SQL 中加入 3 个表
【发布时间】:2018-02-01 12:26:54
【问题描述】:

我在加入 3 张桌子时迷路了。 我有 3 张桌子:

  • 事件表
  • 带有日期范围的表格
  • 包含某天某个事件的预订计数的表格

现在我想创建一个时间线,这样对于每个事件,我都有一个日期范围,其中包含每天的预订计数(如果没有预订,则为 0)。 见SQL Fiddle example

现在的问题是我可以从日期范围和事件中选择所有记录,但我无法将预订表与它一起加入以选择当天的预订计数。我需要它来创建一个事件的最后 x 天图表,其中包含这些天的预订数。

预期的输出将是对于每个日期 (2017-01-01,2017-01-02) 我都有一个事件列表 (1,2,3..) 和当天的预订数(或者如果有没有匹配的 reservationcount 记录,0) 该怎么做?

2017-01-01  1   0
2017-01-02  1   65
2017-01-03  1   345
2017-01-04  1   0
2017-01-05  1   0
2017-01-06  1   0

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    在您的示例示例中,EventsEventDate 之间没有直接链接,因此如果您想将所有事件附加到每个可用日期,您需要有一个 这些表之间的笛卡尔积(交叉连接)。

    在特定日期和事件中可能有也可能没有预订,因此您需要 LEFT JOIN 与预订表。

    下面的查询应该会给你想要的输出。

    SELECT SelDate,EV.EventId, ISNULL(ResCount,0) as ResCount FROM
    EventDates ED
    INNER JOIN Events EV ON 1=1
    LEFT JOIN Reservations RES ON ED.SelDate = RES.EventDate AND EV.EventId=RES.EventId
    

    或者你也可以写成

    SELECT ED.*, ISNULL(ResCount,0) as ResCount FROM
    (
      SELECT SelDate, EventId
      FROM EventDates ,Events
    ) ED
    LEFT JOIN Reservations RES ON ED.SelDate = RES.EventDate AND ED.EventId=RES.EventId
    

    【讨论】:

      【解决方案2】:

      你很接近,但使用了错误的外连接并错过了一个条件。

      Select EventDates.SelDate,Events.EventID
        ,coalesce(Reservations.ResCount,0)
      from EventDates cross join Events -- one row for each event/date
      left Outer Join Reservations -- join existing reservations
      on Events.EventID=Reservations.EventID
      and EventDates.SelDate = Reservations.EventDate
      order by Events.EventID, EventDates.SelDate
      

      fiddle

      【讨论】:

        猜你喜欢
        • 2015-10-10
        • 2021-03-05
        • 1970-01-01
        • 2016-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-03
        相关资源
        最近更新 更多