Tenho três tabelas: product, users, and orders
product
: lista de todos os produtos e seus status. Esta tabela tem um campo chamado previousProductId
. O código de um produto pode ser alterado várias vezes e, se for, previousProductId
conterá o código do predecessor imediato. Por exemplo, se um produto tem o código 1057 e então uma nova linha é adicionada para este produto com um novo código 1060 então o previousLineId terá um código 1057. Isso se repete toda vez que uma nova linha com um novo código é adicionada para um produto existente.
users
: lista de todos os usuários
orders
: lista de todos os pedidos feitos pelos usuários
Agora tenho que escrever uma consulta para obter todos os pedidos com produtos ativos. Preciso garantir que todos os usuários que solicitaram as versões anteriores de um produto ativo também sejam incluídos no conjunto de resultados. Quero usar o CTE recursivo para subir na cadeia para recuperar todos os IDs de produtos anteriores de um determinado produto e recuperar as informações necessárias dessa maneira, mas esse método parece um pouco volumoso. Eu queria saber se existe uma maneira melhor e mais simples de fazer isso. Obrigado!
Create table #product
(
productId Int primary key Identity(1,1),
name varchar(100),
price numeric(18,5),
previousProductId Int,
active bit
)
Create table #users
(
userId Int Primary key,
name varchar(100)
)
Create table #orders
(
orderId Int primary key,
userId Int,
productId Int
)
Insert Into #product values ('Sony TV', 200.23, null, 0), ('Sony Tv New', 240.43, 1, 0), ('Apple Watch', 300.45, null, 1)
,('Samsung Mobile',1050, null,0),('Sony TV Advanced', 400, 2,1)
Insert Into #users values (1,'John'), (2,'Mary'), (3,'Kevin'), (4,'Joe'), (5,'Andy'),(6,'Jim'),(7,'Pam')
Insert Into #orders values (1, 1, 1), (2, 2, 1),(3, 3,2), (4,4,3), (5,5,3),(6,6,4),(7,7,5)
select t_p.productId, t_p.name, t_p.price, t_p.previousProductId, t_p.active
,t_u.name as username, t_o.orderId
from #product t_p
join #orders t_o
on t_p.productId = t_o.productId
join #users t_u
on t_u.userID = t_o.userId
where t_p.active = 1
drop table if exists #product
drop table if exists #orders
drop table if exists #users
Tive que limpar um pouco seu DDL/DML pois estava com um erro de sintaxe:
Eu prefiro variáveis de tabela para isso, pois não há limpeza com que se preocupar.
Vamos à sua pergunta. Não tenho certeza se a saída esperada definida é o que você realmente deseja, pois não faz referência a uma base ou ID pai. Também parece estar faltando o orderId 6.
Uma técnica rCTE para obter a 'base' (pai final) pode ser escrita assim:
Posso ter entendido mal sua intenção e, na verdade, você só quer o PreviousProductID (no caso de OrderId 7, 2 em vez de 1), se for esse o caso, você deve ser capaz de substituir o lado recursivo do rCTE
a.baseID AS baseID
pora.productId AS baseID