我有一张桌子,上面写着何时将一种产品替换为另一种产品,并且该另一种产品也可能出现在该表中。
我想知道如何在给定产品的情况下编写查询,以获取最新的可用(已替换)产品。
示例:
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称为“最终产品”。
问题在于产品可以具有不同的替换条目,因此我不知道我需要多少个接头...
答案 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