繁体   English   中英

在迁移数据时创建父子关系(SQL Server 2008)

[英]creating parent child relationship when migrating data (sql server 2008)

背景

我正在从客户端迁移数据,它们以csv格式出现。到目前为止,我已将所有数据导入到临时数据库中。

现在

我需要使用一系列脚本将此数据从暂存数据库使用sql脚本移动到另一个数据库。

像往常一样,该数据没有正确的主键和外键,因此由我来建立某种关系

让我们举个例子。给定2个表Customer和CustomerOrder,如何插入/创建两者之间的关系? 如何将客户表中的ID插入到CustomerOrder表中?

我必须对许多表执行此操作,因此我想建立一种执行方法!

桌子

        IF object_id(N'Customer', 'U') IS NOT NULL
            DROP TABLE Customer

        GO
        CREATE TABLE [dbo].[Customer](
            [Id] [bigint] IDENTITY(1,1) NOT NULL,
            [Name] [varchar](50) NULL,
            [Surname] [varchar](50) NULL,
         CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED 
        (
            [Id] ASC
        )
        ) ON [PRIMARY]


        IF object_id(N'CustomerOrder', 'U') IS NOT NULL
            DROP TABLE CustomerOrder

        GO
        CREATE TABLE [dbo].[CustomerOrder](
            [Id] [bigint] IDENTITY(1,1) NOT NULL,
            [CustomerId] [bigint] NOT NULL,
            [OrderNo] [bigint] NULL,
            [OrderName] [varchar](50) NOT NULL,
         CONSTRAINT [PK_CustomerOrder] PRIMARY KEY CLUSTERED 
        (
            [Id] ASC
        )
        ) ON [PRIMARY]

尝试将数据从暂存db插入mydb

        Insert MyDatabase.dbo.Customer
        (   --Id - this column value is auto-generated
            Name,
            Surname
        )
        Select Name,Surname
        from StagingDatabase.dbo.Customer

        INSERT MyDatabase.dbo.CustomerOrder
        (
            --Id - this column value is auto-generated
            CustomerId,
            OrderNo,
            OrderName
        )
        SELECT CustomerId=???,OrderNo,OrderNo
        FROM StagingDatabase

当您遇到不良数据并且需要创建并插入父/子数据时,您将如何处理?

有什么建议么?

填充Customer表。 (这些查询假定自动生成的主键)。

insert into Customer (Name,Surname)
    select Name,Surname from staging_table;

填充CustomerOrders表。 使用非主键字段加入Customer以获得主键。

insert into CustomerOrders (CustomerId,OrderNo,OrderName)
    select cust.Id, OrderNo, OrderName
        from staging_table staging
        join Customer cust on
            cust.Name    = staging.Name and
            cust.Surname = staging.Surname;

加入唯一标识客户所需的所有字段。 显然,仅靠名字通常不足以做到这一点,但是我认为这只是一个例子。

另外,如果任何字段可以为null,则必须在连接中专门处理该字段。 否则,将省略具有null的行:

 join customer cust on
    coalesce(cust.Name,'**NULL**') = coalesce(staging.Name,'**NULL**') and
    ... etc. ...

只要在实际数据中永远不会出现任何内容,在coalesce使用什么字符串都没有关系。

暂无
暂无

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

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