获取每个条目的最新记录

时间:2019-05-02 18:09:28

标签: sql sql-server

我有一张桌子,上面写着何时将一种产品替换为另一种产品,并且该另一种产品也可能出现在该表中。

我想知道如何在给定产品的情况下编写查询,以获取最新的可用(已替换)产品。

示例:

    Product_From   Product_To
    -------------------------
    A              E
    A              D
    B              F
    C              B
    D              F
    D              G

如何查询以获取以下输出:

    Product_From   Product_Final
    -------------------------
    A              E
    A              F
    A              G
    B              F
    C              F
    D              F
    D              G

将产品A替换为产品D和E,但将产品D替换为F和G,因此产品A将产品E,F和G称为“最终产品”。

问题在于产品可以具有不同的替换条目,因此我不知道我需要多少个接头...

2 个答案:

答案 0 :(得分:1)

这是一个遍历图的问题。递归CTE是解决方案:

with p as (
      select v.*
      from (values ('A', 'E'), ('A', 'D'), ('B', 'F'), ('C', 'B'), ('D', 'F'), ('D', 'G')) v(pfrom, pto)
     ),
     cte as (
      select pfrom, pto
      from p
      where not exists (select 1 from p p2 where p2.pfrom = p.pto)
      union all
      select p.pfrom, cte.pto
      from cte join
           p
           on cte.pfrom = p.pto
     )
select *
from cte
order by pfrom, pto;

Here是db <>小提琴。

答案 1 :(得分:1)

您可以通过左连接来实现:

select 
  p1.product_from,
  coalesce(p2.product_to, p1.product_to) product_final 
from products p1 left join products p2 
on p2.product_from = p1.product_to 

请参见demo
结果:

> product_from | product_final
> :----------- | :------------
> A            | E            
> A            | F            
> A            | G            
> B            | F            
> C            | F            
> D            | F            
> D            | G