[英]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.