0

我被困在一个应该非常简单但我无法通过连接解决的情况:(假设我有 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 甚至列中第一个状态的名称很容易,但我不知道如何在 1 个表中提取新旧状态的状态名称。

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

4

2 回答 2

2
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'
于 2013-08-15T08:40:30.473 回答
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;
于 2013-08-15T08:40:44.690 回答