【问题标题】:SQL help in joining tables连接表的 SQL 帮助
【发布时间】:2013-08-15 08:19:18
【问题描述】:

我被困在一个应该非常简单但我无法通过连接解决的情况:(假设我有 3 个包含订单、订单状态和状态名称的表,它们由订单 ID 和状态 ID 链接。

带订单的表 1:id_order、number、customer_name、fk_state

带有订单历史记录的表 2: fk_order, fk_old_order_state, fk_new_order_state, new_state_date

带有州名的表 3: id_state, state_name

id_state 只是从 1 到 20 的每个州的唯一编号,没有州名就没有意义。我想获得一张表格,我可以在其中查看处于“已取消”状态的所有订单的新旧状态名称(不是 ID!),以便查看订单在哪个阶段被取消。所以我需要一个包含以下数据的表格:order.number、旧州名、新州名、新州日期

获取新旧状态的 id 甚至列中第一个状态的名称很容易,但我不知道如何在一个表中提取新旧状态的状态名称。

我有更多类似的任务,所以如果你能帮助我完成这个任务会很棒,我能理解这个想法。 谢谢

【问题讨论】:

    标签: sql join


    【解决方案1】:
    select
        o.id_order,
        o.number,
        o.customer_name,
        oh.new_state_date,
        sno.state_name as old_state_name
    from order_history as oh
        inner join orders as o on o.id_order = oh.fk_order
        inner join state_names as snn on snn.id_state = oh.fk_new_order_state
        left outer join state_names as sno on sno.id_state = oh.fk_old_order_state
    where snn.state_name = 'canceled'
    

    【讨论】:

      【解决方案2】:

      您只需加入表 3(带有州名)两次。一次为旧状态,一次为新状态。因此,使用表别名来确保没有冲突很重要(下面我使用 os 表示旧状态,使用 ns 表示新状态)

      SELECT  o.number,
              os.state_name AS old_state_name,
              ns.state_name AS new_state_name,
              oh.new_state_date
      FROM    orders o
              INNER JOIN order_History oh
                  ON o.id_order = oh.fk_order
              INNER JOIN state_names os
                  ON os.id_state = oh.fk_old_order_state
              INNER JOIN state_names ns
                  ON ns.id_state = oh.fk_new_order_state;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-10
        • 1970-01-01
        • 2011-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多