背景
我正在从客户端迁移数据,它们采用csv格式。我导入了临时数据库中的所有数据,到目前为止一直很好。
立即
我需要使用一系列脚本将此数据从此临时数据库移动到使用sql脚本的另一个数据库。
像往常一样,这些数据没有正确的主键和外键,所以我可以创建某种关系
让我们举个例子给出2个表Customer和CustomerOrder如何插入/创建两者之间的关系? 如何将customer表中的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]
尝试将数据从登台数据库插入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
当您遇到不良数据并且需要创建和插入父/子数据时,您是如何做到的?
有什么建议吗?
答案 0 :(得分:1)
填充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,则必须在加入时特别处理。否则,将省略具有空值的行:
join customer cust on
coalesce(cust.Name,'**NULL**') = coalesce(staging.Name,'**NULL**') and
... etc. ...
在coalesce
中使用的字符串并不重要,只要它不会出现在实际数据中。