I'm trying to write a query where it will recursively seek to find inception or the part number has changed.
There is a single table stktrans that holds the IN and the OUT transactions of any orders.
When something is sent OUT it will have an IN_Nr which can be used to trace back the the IN transaction. The OrderNr links the IN to the OUT
EDIT: Given any IN_Nr I'd like to be able to trace back to the original order it was purchase on. In the table below - TransID 1. But showing the full timeline of the events like the table below.
| TransID | Part | IN_Nr | OUT_Nr | OrderNr | Type |
|---|---|---|---|---|---|
| 8 | 123-1 | 232753 | 232233 | 888777 | OUT |
| 7 | 123-1 | 232753 | NULL | 125707 | IN |
| 6 | 123-1 | 203944 | 224789 | 125707 | OUT |
| 5 | 123-1 | 203944 | NULL | 123332 | IN |
| 4 | 123-1 | 179409 | 198306 | 123332 | OUT |
| 3 | 123-1 | 179409 | NULL | 111222 | IN |
| 2 | 123-1 | 176573 | 171516 | 111222 | OUT |
| 1 | 123-1 | 176573 | NULL | 666000 | IN |
The patter between the tracing back is as in the picture below:
Currently, I have a very un-dynamic query which can trace back 4 levels from any given IN_Nr:
DECLARE @IN_Nr INT = 232753
;WITH StkOUT_CTE AS (
SELECT
ST.TransID,
ST.Part,
ST.IN_Nr,
ST.OUT_Nr,
ST.OrderNr,
ST.Type
FROM
StkTrans ST
WHERE
OUT_Nr IS NOT NULL
AND ST.Type = 'OUT'
),
StkIN_CTE AS (
SELECT
ST.TransID,
ST.Part,
ST.IN_Nr,
ST.OUT_Nr,
ST.OrderNr,
ST.Type
FROM
StkTrans ST
INNER JOIN StkOUT_CTE SI ON SI.IN_Nr = ST.IN_Nr
WHERE
ST.Type = 'IN'
)
SELECT
*
FROM
(
SELECT
1 RowOrder, *
FROM
StkOUT_CTE
WHERE IN_Nr = @IN_Nr
UNION
SELECT
2 RowOrder, *
FROM
StkIN_CTE
WHERE IN_Nr = @IN_Nr
UNION
SELECT 3 RowOrder, *
FROM
StkOUT_CTE
WHERE
OrderNr = (SELECT OrderNr FROM StkIN_CTE WHERE IN_Nr = @IN_Nr)
UNION
SELECT 4 RowOrder, *
FROM
StkIN_CTE
WHERE
IN_Nr = (
SELECT IN_Nr
FROM
StkOUT_CTE
WHERE
OrderNr = (SELECT OrderNr FROM StkIN_CTE WHERE IN_Nr = @IN_Nr))
) ST
To Create a similar setup:
CREATE TABLE StkTrans (
TransID INT,
Part VARCHAR(25),
IN_Nr INT,
OUT_Nr INT,
OrderNr INT,
Type VARCHAR(3)
)
INSERT INTO StkTrans
(TransID, Part, IN_Nr, OUT_Nr, OrderNr, Type)
VALUES
(1, '123-1', 176573, NULL, 666000, 'IN' ),
(2, '123-1', 176573, 171516, 111222, 'OUT' ),
(3, '123-1', 179409, NULL, 111222, 'IN' ),
(4, '123-1', 179409, 198306, 123332, 'OUT' ),
(5, '123-1', 203944, NULL, 123332, 'IN' ),
(6, '123-1', 203944, 224789, 125707, 'OUT' ),
(7, '123-1', 232753, NULL, 125707, 'IN' ),
(8, '123-1', 232753, 232233, 888777, 'OUT' )
Any guidance that might point me in the right direction on how to use the CTE recursively would be great!
