将一个表中的数据插入另外两个表

时间:2016-02-10 16:48:09

标签: sql-server sql-server-2008

我有一张如下表格:

dbo.vertrag

vertrag_id (PK, nvarchar(50), not null)
kunden_id (int, not null)
...
vertrag_von (datetime, not null)
vertrag_bis (datetime, not null)

此表中的数据应插入另外两个表中,如下所示:

dbo.contracts

id (PK, int, not null)
contractNumber (nvarchar(50), not null)
...
validityPeriodId (int, not null)

dbo.validityPeriods

id (PK, int, not null)
validFrom (datetime, not null)
validTil (datetime, not null)

问题是关于有效期: 因此,第一个任务是在表格中创建有效期(vertrag_von,vertrag_bis)&& 39; validityPeriods'并获取标识符。然后,应将此标识符ID插入到列' validityPeriodId'同时在表格中创建条目' contract'。

如果有效期存在,查询还应检查,因此不应创建重复的期间。

此外,此任务应在作业中运行,因为源表可能会定期更新。也许在每次运行之前截断表格是一个想法。

我认为这必须是一个很好的查询,但不知道如何开始。

编辑:一些简单的例子:

dbo.vertrag

vertrag_id = 'A33224'
kunden_id = '670'
vertrag_von = '2016-01-02 12:00:00.000'
vertrag_bis = '2016-01-31 12:00:00.000'

dbo.contracts

id = autgenerated
...
contractNumber = 'A33224'
validityPeriodId = 1

dbo.validityPeriods

id = 1
validFrom = '2016-01-02 12:00:00.000'
validTil = '2016-01-31 12:00:00.000'

1 个答案:

答案 0 :(得分:0)

因此,它实际上是两个可以作为1个存储过程运行的查询;伪代码如下:

BEGIN TRANSACTION 

--insert new periods
INSERT INTO validity_periods (validFrom, validTil)
SELECT DISTINCT a.vertrag_von, a.vertrag_bis
FROM vertrag a
LEFT JOIN validity_periods b ON (a.vertrag_von = b.validFrom) 
AND (a.vertrag_bis = b.ValidTil) 
WHERE b.ID IS NULL

--insert contracts with period_id matching dates
INSERT INTO contracts (contractNumber, validityID)
SELECT a.vertrag_id, b.ID
FROM vertrag a 
JOIN validityperiod b ON (a.vertrag_von = b.validFrom) 
AND (a.vertrag_bis = b.ValidTil) 

COMMIT

您可能还想在有效期间表中的两个日期添加UNIQUE索引或约束,以防止重复。