如何从CTE的自我联接中获取重复记录

时间:2018-07-11 08:22:54

标签: sql

Table t1
rule_id 
1
2
3
3
Table t2
rule_id     status      record_seq
1           approve       2
1           pending       1
2           approve       2
2           pending       1

尝试如下

select * from t1,t2 where t1.rule_id=t2.rule_id and record_seq=2;
rule_id   rule_id       status      record_seq
1           1           approve     2
2           2            approve    2

一旦状态从待定更改为批准,record_seq将更新。但是record_seq不喜欢静态,所以根据我的假设,对record_seq进行取值和条件是错误的。

所以请向我建议另一种方式,使我仅在具有加入条件或任何其他逻辑的情况下才能获得批准状态。

2 个答案:

答案 0 :(得分:1)

尝试一下

select * 
from t1 inner join t2 on (t1.rule_id=t2.rule_id )
where t2.record_seq = (select max(record_seq) from t2 t 
                        where t.rule_id = t2.rule_id)

注意:我假设您想要最新的record_seq

答案 1 :(得分:0)

您似乎正在使用SQL Server,如果可以,则可以将row_number()函数与JOIN一起使用:

select top (1) with ties t1.rule_id, t2.status, t2.record_seq
from t1 inner join
     t2
     on t1.rule_id = t2.rule_id
order by row_number() over (partition by t1.rule_id order by t2.record_seq desc);

但是,这没有保证提供approve状态rules_id。因此,您可以将order by子句更改为:

. . .
order by row_number() over (partition by t1.rule_id 
                            order by (case when t2.status = 'approve' then 0 else 1 end)
                            );