首页 > 解决方案 > 获取所有可能的条目 SQL Join

问题描述

给定以下产品和替代表,我怎样才能获得具有所有可能性的输出?

产品表

> Category | Year | Product Code
> :--------|------|-------------
> Animals  | 1998 | A0001
> Sports   | 2001 | A0002

替换表

> Product From | Product To
> :------------|------------
> A0001        | A0003
> A0002        | A0004
> A0003        | A0005
> A0004        | A0006
> A0006        | A0007

产品 A0001 被替换为 A0003,然后 A0003 被替换为 A0005。

产品 A0002 替换为 A0004,A0004 替换为 A0006,然后 A0006 替换为 A0007。

所需的输出是:

> Category | Year | Product From | Product To
> :--------|------|--------------|-----------
> Animals  | 1998 | A0001        | A0003
> Animals  | 1998 | A0003        | A0005
> Sports   | 2001 | A0002        | A0004
> Sports   | 2001 | A0004        | A0006
> Sports   | 2001 | A0006        | A0007

我认为 COALESCE 函数可能对我有帮助,但我无法构建查询。

标签: sqltsqljoin

解决方案


一个简单的连接不能产生这个结果。您需要遍历一个转换图来生成每个查询。您可以使用CTE通过递归查询来执行此操作

鉴于这些表格:

declare @product table ( Category nvarchar(30), Year int, ProductCode nvarchar(30))

insert into @product 
values
('Animals',1998 ,'A0001'),
('Sports'   ,2001,'A0002');

declare @substitusion table (ProductFrom nvarchar(30),ProductTo nvarchar(30));

insert into @substitusion 
values
('A0001','A0003'),
('A0002','A0004'),
('A0003','A0005'),
('A0004','A0006'),
('A0006','A0007');

此查询将遍历转换并生成所需的结果:

with x as (
    --Create the initial result by joining Product and Substitution
    select Category,Year,ProductFrom,ProductTo
    from @product p inner join @substitusion s on p.ProductCode=s.ProductFrom
    union all
    --Join the *previous* result with the next Substitution
    select Category,Year,next.ProductFrom,next.ProductTo
    from x as previous 
    inner join @substitusion next on previous.ProductTo=next.ProductFrom
)
select * 
from x
order by Category

这产生:

Category    Year    ProductFrom ProductTo
Animals     1998    A0001       A0003
Animals     1998    A0003       A0005
Sports      2001    A0002       A0004
Sports      2001    A0004       A0006
Sports      2001    A0006       A0007

第一个查询通过连接Product和生成第一个结果Substitution。下一个查询通过将前一个 ProductTo 连接到下一个 ProductFrom 将任何以前的结果与下一个替换连接起来


推荐阅读