Получить все возможные записи SQL Join - PullRequest
2 голосов
/ 10 октября 2019

С учетом следующих таблиц продукта и замены, как я могу получить выходные данные со всеми возможностями?

Таблица продукта

> 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 может мне помочь, но я не могу построить запрос.

1 Ответ

1 голос
/ 10 октября 2019

Простое объединение не может привести к такому результату. Вам нужно пройти график переходов для генерации каждого запроса. Вы можете сделать это с помощью рекурсивного запроса, используя a 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. Запрос next объединяет все предыдущие результаты со следующей заменой, соединяя предыдущий ProductTo со следующим ProductFrom

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...