【问题标题】:Joining one record to resultset in Oracle SQL在 Oracle SQL 中将一条记录加入结果集
【发布时间】:2013-11-23 11:02:31
【问题描述】:

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

我当前查询的问题是它在我的结果集中复制了返回的行,显示每一个 OLD_VAL Insurance_State 中的记录

        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

我怎样才能调整我的查询以便它做到这一点。

我尝试在连接中执行内部选择语句,但它不喜欢我的语法

有什么想法吗?

【问题讨论】:

    标签: sql oracle join


    【解决方案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 或添加时间。

    【讨论】:

    • 如果我在 Audit_table 中使用名为“Change_Date”的列会怎样
    • 抱歉混淆了我的查询
    • 当状态改变时,记录被添加到表中,我是否理解正确?和字段“Change_Date” - 此类记录的添加时间?如果是这样 - 这正是您所需要的。
    • 是的,我可以使用 ORDER BY CHANGE_DATE DESC 来获取最新的更改。
    猜你喜欢
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多