SQL帮助加入表

时间:2013-08-15 08:19:18

标签: sql join

我陷入了一个应该非常简单的案例,但我不能用连接来解决这个问题:(假设我有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之间每个州的唯一编号,没有州名称就没有意义。我希望得到一张表格,我可以看到状态为“已取消”的所有订单的新旧州名(不是ids!),以便查看订单被取消的阶段。所以我需要一个包含以下数据的表: order.number,旧状态的名称,新状态的名称,新状态的日期

很容易获得旧状态和新状态的ID,甚至是列中第一个状态的名称,但我不知道如何为新旧状态提取1个表状态名称。

我有更多类似的任务,所以如果你帮我解决这个问题会更好,我能理解这个想法。 感谢

2 个答案:

答案 0 :(得分: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'

答案 1 :(得分: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;