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