Sql 如何通过生成id SSI将表拆分为主/明细表?

Sql 如何通过生成id SSI将表拆分为主/明细表?,sql,sql-server,database,Sql,Sql Server,Database,我把一个平面文件放在一张桌子里 标签p是给主人的 标记I用于详细信息 总是在p行之前加上n个I行 问题是,I行没有加入p行的ID 需要生成一个ID将p行与I行连接起来 p行有两个字段,这两个字段可能会有所帮助。 字段SequenceNumber存储顺序ID。 字段NumberOfItems存储属于P行的I行数 我需要将数据拆分为两个带有标识ID的主/明细表。 我附加了一个带有数据的图像 非常感谢 Original Table RecordType SequenceNumber NumberOf

我把一个平面文件放在一张桌子里

标签p是给主人的 标记I用于详细信息

总是在p行之前加上n个I行

问题是,I行没有加入p行的ID

需要生成一个ID将p行与I行连接起来

p行有两个字段,这两个字段可能会有所帮助。 字段SequenceNumber存储顺序ID。 字段NumberOfItems存储属于P行的I行数

我需要将数据拆分为两个带有标识ID的主/明细表。 我附加了一个带有数据的图像

非常感谢


Original Table
RecordType SequenceNumber NumberOfItems TicketHeaderKey UnitID
P          1              3             ;               1
I          19900          0             FA              19900
I          3000           0             BK              3000
I          0              0             BK              0
P          2              1             ;               1
I          19900          0             FA              19900
P          3              2             ;               1
I          19900          0             FA              19900
I          3000           0             BK              3000

Need Split into two tables some like this

Master Table
RecordType SequenceNumber NumberOfItems TicketHeaderKey UnitID
P          1              3             ;               1
P          2              1             ;               1
P          3              2             ;               1

Detail Table
RecordType SequenceNumber idMasterTable TicketHeaderKey UnitID
I          19900          1             FA              19900
I          3000           1             BK              3000
I          0              1             BK              0
I          19900          2             FA              19900
I          19900          3             FA              19900
I          3000           3             BK              3000

我主要关心的是原始表中没有正确的行序列。没有这一点,就无法对有序数据集进行GTD

为了期待您纠正这一点,我添加了一个名为RowSeq的专栏

示例或

返回


我不确定要插入到每个主表和明细表中的数据,但这里有一种方法

对于主表:

INSERT INTO MasterTable
SELECT 
    SequenceNumber AS id, 
    UnitId, 
    NumberOfItems, 
    TicketHeaderKey, 
    PrintType 
FROM tabletosplit 
WHERE RecordType = 'P' 
ORDER BY SequenceNumber;
有关详细信息表:

WITH auxtable(id, RecordType, UnitId, SequenceNumber, NumberOfItems, TicketHeaderKey, PrintType, auxnumber, parentNumberOfItems, parentid) 
AS (
SELECT 1, RecordType, UnitId, SequenceNumber, NumberOfItems, TicketHeaderKey, PrintType, 1, NumberOfItems, SequenceNumber 
FROM tabletosplit WHERE SequenceNumber = 1
UNION ALL
SELECT
    auxtable.id + 1,
    T.RecordType, T.UnitId, T.SequenceNumber, T.NumberOfItems, T.TicketHeaderKey, T.PrintType, 
    CASE WHEN T.RecordType = 'P' THEN 1 else auxtable.auxnumber + 1 END, 
    CASE WHEN T.RecordType = 'P' THEN T.NumberOfItems ELSE auxtable.parentNumberOfItems END, 
    CASE WHEN T.RecordType = 'P' THEN T.SequenceNumber ELSE auxtable.parentid END 
    FROM auxtable 
    INNER JOIN (Select ROW_NUMBER() OVER(ORDER BY (SELECT NULL))  AS id, RecordType, UnitId, SequenceNumber, NumberOfItems, TicketHeaderKey, PrintType
                FROM tabletosplit 
                WHERE SequenceNumber <> 1) AS T
    ON auxtable.id = T.id 
)
INSERT INTO DetailTable
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS id, auxtable.UnitId , auxtable.TicketHeaderKey, auxtable.PrintType, auxtable.Parentid, auxtable.auxnumber -1 as DetailIndex
FROM auxtable
WHERE auxtable.RecordType = 'I';
结果:

工作样本 希望对你有帮助

WITH auxtable(id, RecordType, UnitId, SequenceNumber, NumberOfItems, TicketHeaderKey, PrintType, auxnumber, parentNumberOfItems, parentid) 
AS (
SELECT 1, RecordType, UnitId, SequenceNumber, NumberOfItems, TicketHeaderKey, PrintType, 1, NumberOfItems, SequenceNumber 
FROM tabletosplit WHERE SequenceNumber = 1
UNION ALL
SELECT
    auxtable.id + 1,
    T.RecordType, T.UnitId, T.SequenceNumber, T.NumberOfItems, T.TicketHeaderKey, T.PrintType, 
    CASE WHEN T.RecordType = 'P' THEN 1 else auxtable.auxnumber + 1 END, 
    CASE WHEN T.RecordType = 'P' THEN T.NumberOfItems ELSE auxtable.parentNumberOfItems END, 
    CASE WHEN T.RecordType = 'P' THEN T.SequenceNumber ELSE auxtable.parentid END 
    FROM auxtable 
    INNER JOIN (Select ROW_NUMBER() OVER(ORDER BY (SELECT NULL))  AS id, RecordType, UnitId, SequenceNumber, NumberOfItems, TicketHeaderKey, PrintType
                FROM tabletosplit 
                WHERE SequenceNumber <> 1) AS T
    ON auxtable.id = T.id 
)
INSERT INTO DetailTable
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS id, auxtable.UnitId , auxtable.TicketHeaderKey, auxtable.PrintType, auxtable.Parentid, auxtable.auxnumber -1 as DetailIndex
FROM auxtable
WHERE auxtable.RecordType = 'I';