我有一张如下表格:
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'
答案 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索引或约束,以防止重复。