繁体   English   中英

SQL:复制行和降序集成

[英]SQL: Copy Rows and Descending Integrate

我正在编写此查询,但遇到了精神障碍。 我一直在我周围循环,这令人沮丧。

表格如下:

PO_HEADER(IC_PO_HEADER唯一)

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

PO_LINE(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        8246322         214580

每列上大约有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        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条记录。

伪代码:

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

以下将产生您指定的输出。

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)

演示

可能是这样的,我没有测试:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM