将SQL Server表拆分为Header和Details表,通过HeaderID链接

时间:2014-06-19 14:42:00

标签: sql-server

我正在使用SQL Server 2008 Express R2和高级服务。我是训练中的DBA,所以我在学习,因为我更多地接触SQL。我有一个Base表需要拆分为Header和Details表。这两个表将通过HeaderID链接。标题将有一条记录,详细信息最多可包含64条名称/值记录,与标题表中的一条记录相关联。我需要一个Query来将Base表中的数据复制到Header和Details表中。这是设计:

基准表:

CREATE TABLE [dbo].[tblBase](
[ID] [int] IDENTITY(1,1) NOT NULL,
[PartType] [varchar](50) NULL,
[SerialNumber] [varchar](50) NOT NULL,
[Station] [varchar](50) NULL,
[Reject] [varchar](50) NULL,
[Generation] [varchar](50) NULL,
[Mod_25_1_Orifice] [varchar](50) NULL,
[Mod_25_1_LowerBody] [varchar](50) NULL,
[Mod_25_1_OrificeHolderLot] [varchar](50) NULL,
[Mod_25_1_Future1] [varchar](50) NULL,
[Mod_25_1_Future2] [varchar](50) NULL,
[Mod_30_2_Force] [varchar](50) NULL,
[Mod_30_2_Dist] [varchar](50) NULL,
[Mod_35_1_Pintle] [varchar](50) NULL,
[Mod_35_1_Spring] [varchar](50) NULL,
[Mod_35_1_CenterPole] [varchar](50) NULL,
[Mod_35_1_LowerBodyOuterLot] [varchar](50) NULL,
[Mod_40_1_Force] [varchar](50) NULL,
[Mod_40_1_Dist] [varchar](50) NULL,
[Mod_40_2_Force] [varchar](50) NULL,
[Mod_40_2_Dist] [varchar](50) NULL,
[Mod_40_2_DistToPress] [varchar](50) NULL,
[Mod_40_2_OffsetDist] [varchar](50) NULL,
[Mod_50_1_LastForce] [varchar](50) NULL,
[Mod_50_1_LastDist] [varchar](50) NULL,
[Mod_50_3_LeakRate] [varchar](50) NULL,
[Mod_50_3_PressureDrop] [varchar](50) NULL,
[Mod_70_1_SmOring] [varchar](50) NULL,
[Mod_70_1_RestrOrifice] [varchar](50) NULL,
[Mod_70_1_UpperFlBrOring] [varchar](50) NULL,
[Mod_70_1_Filter] [varchar](50) NULL,
[Mod_70_1_FluidConn] [varchar](50) NULL,
[Mod_70_2_LgOring] [varchar](50) NULL,
[Mod_70_2_Coil] [varchar](50) NULL,
[Mod_70_2_Filter] [varchar](50) NULL,
[Mod_100_2_Current] [varchar](50) NULL,
[Mod_100_2_Dist] [varchar](50) NULL,
[Mod_105_1_InletTube] [varchar](50) NULL,
[Mod_105_1_Filter] [varchar](50) NULL,
[Mod_105_1_RestrOrifice] [varchar](50) NULL,
[Mod_105_1_PressDist] [varchar](50) NULL,
[Mod_105_1_TimeStamp] [datetime] NULL,
[Mod_110_1_BarrelFilter] [varchar](50) NULL,
[Mod_110_1_OrificePlate] [varchar](50) NULL,
[Mod_110_1_PressDist] [varchar](50) NULL,
[Mod_115_1_Force] [varchar](50) NULL,
[Mod_115_1_Dist] [varchar](50) NULL,
[Mod_115_1_Force2] [varchar](50) NULL,
[Mod_115_1_Dist2] [varchar](50) NULL,
[Mod_120_1_FluxBrAssem] [varchar](50) NULL,
[Mod_120_1_Coil] [varchar](50) NULL,
[Mod_120_1_LowerFluxBr] [varchar](50) NULL,
[Mod_120_1_PressDist] [varchar](50) NULL,
[Mod_130_1_Nest] [varchar](50) NULL,
[Mod_130_1_UnEnergizedFlow] [varchar](50) NULL,
[Mod_130_1_EnergizedFlow] [varchar](50) NULL,
[Mod_140_1_TimeStamp] [datetime] NULL,
[Mod_140_1_LeakRate] [varchar](50) NULL,
[Mod_140_1_PressureDrop] [varchar](50) NULL,
[Mod_35_1_TimeStamp] [datetime] NULL,
[Mod_70_1_TimeStamp] [datetime] NULL,
[Mod_130_1_TimeStamp] [datetime] NULL,
[Mod_135_1_TimeStamp] [datetime] NULL,
[Mod_135_2_TimeStamp] [datetime] NULL,
[Mod_150_1_LeakRate] [varchar](50) NULL,
[Mod_150_1_PressureDrop] [varchar](50) NULL,
[Mod_150_1_TimeStamp] [datetime] NULL,
[LoopA_pallet] [varchar](10) NULL,
[LoopB_pallet] [varchar](10) NULL,
[LoopC_pallet] [varchar](10) NULL,
CONSTRAINT [PK_tblLanco] PRIMARY KEY CLUSTERED 
(
    [SerialNumber] ASC
) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,     ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

标题表:

CREATE TABLE [dbo].[tblHeader](
[HeaderID] [bigint] IDENTITY(1,1) NOT NULL,
[SerialNumber] [varchar](50) NOT NULL,
[PartType] [varchar](50) NULL,
[Station] [varchar](50) NULL,
[Reject] [varchar](50) NULL,
[Generation] [varchar](50) NULL,
CONSTRAINT [IX_tblLancoHeader] UNIQUE NONCLUSTERED 
(
    [SerialNumber] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,  ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

详情表:

CREATE TABLE [dbo].[tblLDetail](
[DetailID] [bigint] IDENTITY(1,1) NOT NULL,
[HeaderID] [bigint] NOT NULL,
[Name] [varchar](100) NOT NULL,
[Value] [varchar](100) NULL
) ON [PRIMARY]

希望这很清楚,以便我可以帮助编写查询以将数据从Base表中复制到Header&详情表。

谢谢,

1 个答案:

答案 0 :(得分:0)

INSERT  tblHeader (
    [SerialNumber], [PartType], [Station], [Reject], [Generation]
)
SELECT  [PartType], [SerialNumber], [Station], [Reject], [Generation]
FROM    tblBase;

INSERT tblDetail (
    [HeaderID], [Name], [VALUE]
)
SELECT  h.HeaderID, 'Mod_25_1_Orifice', b.Mod_25_1_Orifice
FROM    tblBase b
        JOIN tblHeader h ON b.[SerialNumber] = h.[SerialNumber];

INSERT tblDetail (
    [HeaderID], [Name], [VALUE]
)
SELECT  h.HeaderID, 'Mod_25_1_LowerBody', b.Mod_25_1_LowerBody
FROM    tblBase b
        JOIN tblHeader h ON b.[SerialNumber] = h.[SerialNumber];

etc ...对其他62个细节列插入tblDetail 62次