将一条记录连接到Oracle SQL中的结果集

时间:2013-11-23 11:02:31

标签: sql oracle join

我正在尝试从我的Audit_table加入最新的OLD_VAL,它记录了我的主表中名为Insurance_State的列的更改。

我当前查询的问题是它在我的结果集中重复返回的行显示每一个 OLD_VAL 一条保险单中的记录

        SELECT ins.last_upd, cc.id, cc.claim_date, pol.policy_id, ins.state, adt.old_val, ins.review_date, ins.latest_reason, bll.ou_num
    FROM CUSTOMER_CLAIM cc
    JOIN CUSTOMER_CAR car
    ON cc.id = car.ccid
    JOIN POLICY pol
    ON car.integ_id = pol.integ_id
    JOIN INSURANCE_STATE ins
    ON pol.policy_id = ins.policy_id
    JOIN BILLING_ACCT bll
    ON pol.bill_accnt_id = bll.row_id
    --only want to the most recent record from below table
    JOIN AUDIT_TABLE adt
ON pol.policy_id = hst.policy_id

这给出了非常简单的术语输出

D --> A
D --> B
D --> C

实际上我只想要最新的old_val,因此输出将是

D --> C

如何调整我的查询以便这样做。

我尝试在连接中做一个内部select语句,但它不喜欢我的语法

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

你有一点错误:

JOIN AUDIT_TABLE adt ON pol.policy_id = hst.policy_id

可能是这样:

JOIN AUDIT_TABLE adt ON pol.policy_id = adt.policy_id

回答你的问题:

join (
    select policy_id, old_val from (  
          select at.policy_id, at.old_val, 
                 rank() over (partition by at.policy_id order by at.old_val desc) as rnk 
          from AUDIT_TABLE at
        ) where rnk = 1
    ) adt on pol.policy_id = adt.policy_id

如果状态是这样的名称(A,B,C,D等),这应该有用。如果不是,则在表达式order by at.old_val desc中,您应该使用其他字段,例如ID或添加时间。