1

MS-SQL 서버의 Sage Manufacturing Line 50에서 BOM (Bill Of Materials)을 반복적으로 반복하려고합니다.Sage Manufacturing Line 50 BOM (Bill of Materials), SQL 재귀 적 테이블 트리 반복

BOM 트리 구조는 두 테이블 BOMHeader와 BOMComponent에 포함되어 있습니다. 이들은 BOMHeader.ID = BOMComponent.HeaderID에 의해 링크됩니다. 그래서 이들을 연결하고 특정 BomHeader.BOMReference로 질의하여 BOM의 첫 번째 계층을 얻습니다.

재귀는 각 BOMComponent 자체가 StockCode 인 어셈블리 일 수 있기 때문에 발생합니다. BOMHeader.BomReference로 존재하면 StockCode는 BOM이고 BOMComponents 테이블에 하위 구성 요소가 있음을 나타냅니다.

나는 다이어그램을 그리기 약 반 시간 소비,하지만 난 10 명성 포인트

WITH BOM_CTE (HID, HRef, HDesc, SC, CDesc, CHID, CQ, SEQ) 
AS 
(
    SELECT H.ID as HID, H.BomReference as HRef, H.Description as HDesc, C.StockCode as SC,C.Description as CDesc,C.HeaderID as CHID,C.Quantity as CQ,1 as SEQ 
    FROM [GNT\SAGEL50].[sagel50_46387].[dbo].BomHeaders H 
    JOIN [GNT\SAGEL50].[sagel50_46387].[dbo].BomComponents C 
     ON H.ID = C.HeaderID 
    WHERE H.BomReference like 'SA000001%' 
    UNION ALL 
    SELECT H.ID as HID, H.BomReference as HRef, H.Description as HDesc, C.StockCode as SC,C.Description as CDesc,C.HeaderID as CHID,C.Quantity as CQ,BC.SEQ+1 
    FROM [GNT\SAGEL50].[sagel50_46387].[dbo].BomHeaders H 
    JOIN [GNT\SAGEL50].[sagel50_46387].[dbo].BomComponents C 
     ON H.ID = C.HeaderID 
    JOIN BOM_CTE BC 
     ON HRef = BC.SC 
) 
Select * From BOM_CTE 

위의 코드는 최상위 레벨을 나열하고 다시 저주를하지 않습니다, 확인하여 필요에 따라 나는 그것을 게시 할 수 없습니다 BOMComponents 테이블에서 파생 된 결과 Stockcode가 BOMReference 테이블에 BOMReference (하위 구성 요소가 있음)로 나타나는 경우

모든 BomComponents가 BomHeader.BomReference에는 StockCode 참조가 없을 때 나는 두 개의 연결된 테이블 재귀 트리 조회를 달성 할 수 재귀 SQL 코드 문 뒤에 오전

(더 낮은 수준이없는 의미) 종료해야하는 재귀 . 많은 BOM 관련 질문을 한 번 보았지만 한 테이블에있는 것처럼 보이며 두 테이블의 CTE가 있지만 SQL을 처음 접했을 때 내 머리를 얻을 수는 없습니다. 특히 재귀. 어떤 도움

아담

+0

당신 수에게 우리에게 더 좋은 테이블 구조를 주시겠습니까? 어쩌면 ascii와 코드를 사용합니다. 그런 다음 당신이하려는 일에 대한 질문을 던집니다. 지금은 텍스트의 벽과 같이 읽으며 필요한 것을 따라 가기가 어렵습니다. –

+0

보류를 제거 할 수 있습니까? 편집하십시오. – Adamgsb

+0

재귀가 n- 레벨을 확장합니까, 아니면 트리가 "키가 크다"한계가 있습니까? (제한이 합당하면 확장을 하드 코딩 할 수 있습니다.) - PS는 ** BOM **이 무엇인가 의미합니까? 나는 "Byte Order Mark"를 계속 파싱한다. –

답변

0
WITH BOM_CTE (HID, HRef, HDesc, SC, CDesc, CHID, CQ, SEQ) 
AS 
(
    --Anchor Member Definition 
    SELECT H.ID as HID, H.BomReference as HRef, H.Description as HDesc, C.StockCode as SC,C.Description as CDesc,C.HeaderID as CHID,C.Quantity as CQ,1 as SEQ 
    --GNT\SAGEL50.[sagel50_35648] refers to a database on a linked server on my main SQL server 
    FROM [GNT\SAGEL50].[sagel50_35648].[dbo].BomHeaders H 
    JOIN [GNT\SAGEL50].[sagel50_35648].[dbo].BomComponents C 
     ON H.ID = C.HeaderID 
    WHERE H.BomReference like 'SA000009%' 
    UNION ALL 
    --Recursive Member Definition 
    SELECT H.ID , H.BomReference f, H.Description , C.StockCode ,C.Description ,C.HeaderID ,C.Quantity, BC.SEQ+1 
    FROM [GNT\SAGEL50].[sagel50_35648].[dbo].BomHeaders H 
    JOIN [GNT\SAGEL50].[sagel50_35648].[dbo].BomComponents C 
     ON H.ID = C.HeaderID 
    JOIN BOM_CTE BC 
     ON H.BomReference = BC.SC 
) 
Select * From BOM_CTE 

는, 내가 지금해야 할 일은 내가 대신 하드 'SA000009'%의 반복 할 BOMReference을 통과입니다

0

이 스레드는 다시 "하드 코딩"확장 작업을 수행하는 방법을 보여주는 이전 스레드 흥미로운 대답 포인트를 가지고 사전에

감사합니다. 내가 별칭을 제거 후

mysql recursive(tree) parent child category이 지금 작동

+0

답장을 보내 주셔서 감사합니다.하지만 실제로 찾고자했던 것이 아닙니다. 게다가 하나의 테이블 일 뿐이며, 두 개의 테이블이 필요합니다. SQL 재귀 CTE로 처리하고 싶습니다. . – Adamgsb