2012-06-13 4 views
0

저는이 쿼리를 작성 중이며 정신적 도로 블록을 실행 중입니다. 나는 내 자신을 돌아 다니며 계속 좌절하고있다. 여기 SQL : 행 복사 및 내림차순 통합

는 테이블의 :

PO_HEADER (IC_PO_HEADER 고유)

IC_PO_HEADER | po_number | revision_number 
123    p123    0 
456    p123    2   
789    p123    48 

PO_LINE 각 열에 약 150 개 테이블이 있습니다

IC_PO_HEADER | po_number | line_rev_no | ic_line_key | ic_po_line 
123    p123    0  8246321   214578 
123    p123    0  8246322   214579 
123    p123    0  8246322   214580 

(IC_LINE_KEY & IC_PO_LINE 고유), 그러나 이들은입니다 실제로 문제가되는 유일한 것입니다. 모든 것이 확인됩니다. 다음과 같이 전체 라인을 복사하려고합니다 :

IC_PO_HEADER | po_number | line_rev_no | ic_line_key | ic_po_line 
123    p123    0  8246321   214578 
123    p123    0  8246322   214579 
123    p123    0  8246323   214580 
456    p123    2  8246324   214581 
456    p123    2  8246325   214582 
456    p123    2  8246326   214583 
789    p123    48  8246327   214584 
789    p123    48  8246328   214585 
789    p123    48  8246329   214586 

나는 선택한 둥지가있는 삽입물을 사용할 예정 이었지만 계속 원을 그리며 달리고 있습니다. 이것은 샘플 데이터이며, PO_HEADER에 약 15,000 개의 레코드가 있고 현재 PO_LINE에 40,000 개의 레코드가 있습니다.

의사 codey :

If PO_HEADER.ic_po_header does not exist in PO_LINE.ic_po_header AND 
PO_HEADER.po_number does exist in PO_LINE.po_number 
COPY PO_LINE.* where the above is true AND 
    SET PO_LINE.line_rev_no to PO_HEADER.revision_number (do this until no more PO_HEADER.revision_number's exist that do not meet the criteria) 
    AUTONUMBER/INCREMENT PO_LINE.ic_line_key AND PO_LINE.ic_po_line 
+1

무엇 'PO_LINE'에있는 모든 데이터가'IC_PO_HEADER = 456'에 대한 것이라면? 'IC_PO_HEADER = 123'은 무시 될까요? 존재하는 값을 역으로 계산해야합니까? 그것은 불가능할 것인가? – MatBailie

답변

1

이 다음은 사용자가 지정한 출력을 생성합니다.

WITH cte 
    AS (SELECT ph.IC_PO_HEADER, 
       ph.PO_NUMBER, 
       ph.revision_number, 
       pl.ic_line_key, 
       pl.ic_po_line, 
       Row_number() 
        OVER ( 

        ORDER BY ph.IC_PO_HEADER, IC_LINE_KEY) Rn 
     FROM PO_HEADER ph 
       INNER JOIN PO_LINE pl 
         ON ph.po_number = pl.po_number 
     ) 
SELECT t1.IC_PO_HEADER, 
     t1.PO_NUMBER, 
     t1.revision_number, 
     t1.ic_line_key, 
     t2.ic_line_key + t1.rn - 1, 
     t2.IC_PO_LINE + t1.rn - 1 
FROM cte t1 
     INNER JOIN cte t2 
     ON t2.rn = 1 

ORDER BY IC_PO_HEADER 

ROW_NUMBER를 사용하면 AUTONUMBER를 생성 할 수 있습니다. CTE에 합류 자기함으로써 우리가 IC_LINE_KEY 및 IC_PO_LINE 어쩌면이 같은 (t2.rn = 1)

DEMO

0

뭔가에 대한 초기 값을 찾을 수 있습니다, 나는 그것을 테스트하지 않았다

SELECT po_header.* 
     , 'ic_line_key' = (SELECT max(ic_line_key) FROM PO_LINE) + rank() OVER (ORDER BY newid() ASC) 
     , 'ic_po_line' = (SELECT max(ic_po_line) FROM PO_LINE) + rank() OVER (ORDER BY newid() ASC) 
FROM 
    PO_HEADER 
CROSS JOIN 
    PO_LINE 
WHERE 
    po_header.po_number = po_line.po_number 
    AND po_header.ic_po_header <> po_line.ic_po_header 
+0

[왜 테스트하지 않았습니까?] (http://sqlfiddle.com/#!3/6983f/20)? 그리고 그것은 작동하지 않습니다. –

관련 문제