Nat*_*han 6 sql t-sql sql-server sql-server-2005 set-based
假设一个由以下表组成的模式:
巴兹
BazID (PK, Identity)
Description
Run Code Online (Sandbox Code Playgroud)
FooTemplate(A Baz可能有零到多个FooTemplates)
FooTemplateID (PK, Identity)
BazID (FK)
Description
NextGenerationDate
Run Code Online (Sandbox Code Playgroud)
BarTemplate(一个FooTemplate可能有零到多个BarTemplates)
BarTemplateID (PK, Identity)
FooTemplateID (FK)
Description
Run Code Online (Sandbox Code Playgroud)
Foo(A Baz可能有零到多个Foos)
FooID (PK, Identity)
BazID (FK)
Description
Run Code Online (Sandbox Code Playgroud)
酒吧(A Foo可能有零到多个酒吧)
BarID (PK, Identity)
FooID (FK)
Description
Run Code Online (Sandbox Code Playgroud)
每天将执行存储过程以生成已经过其下一代日期的关联实体的实体Foo和Bar实体Baz.
这个过程的第一部分看起来有点像这样:
DECLARE @GeneratedFooIDList TABLE (INT FooID);
INSERT Foo (BazID, Description)
OUTPUT inserted.FooID INTO @GeneratedFooIDList
SELECT
BazID
Description
FROM
FooTemplate
WHERE
NextGenerationDate < GETDATE()
Run Code Online (Sandbox Code Playgroud)
我的问题是我现在可以执行什么语句来生成适当的Bar实体并使它们与新创建的Foo实体正确关联?
编辑:该过程将在运行SQL Server 2005的服务器上执行.
EDIT2:感谢大家的帮助.在仔细考虑了这些信息后,我选择了另一种解决方案.我已经将Foo表中的主键更改为不再是自动生成的标识列,这样就可以执行中间插入临时表以捕获相关的FooTemplateID以及FooID
如果我正确理解你的架构
declare @GeneratedFooIDList table (FooID int, FooTemplateID int)
declare @Date datetime = getdate()
/*
insert Foo (BazID, Description)
output inserted.FooID, FT.FooTemplateID into @GeneratedFooIDList
select
FT.BazID,
FT.Description
from FooTemplate as FT
where
FT.NextGenerationDate < @Date
*/
merge into Foo using
(
select *
from FooTemplate as FT
where
NextGenerationDate < @Date
) as FT on 1 = 0
when not matched then
insert (BazID, Description)
values (BazID, Description)
output inserted.FooID, FT.FooTemplateID into @GeneratedFooIDList;
insert Bar (FooID, Description)
select
G.FooID
BT.Description
from BarTemplate as BT
inner join @GeneratedFooIDList as G on G.FooTemplateID = BT.FooTemplateID
Run Code Online (Sandbox Code Playgroud)
好吧,如果您有 SQL Server 2005,那么这将不起作用。我可以建议另一种解决方案,它将取决于表(BazID, Description)中组合的唯一性FooTemplate。如果有帮助的话,也可以使用 fooTemplate 的变量表和 date < @Date 重写它。
http://sqlfiddle.com/#!3/ee576/29
declare @GeneratedFooIDList table (FooID int)
declare @Date datetime = getdate()
insert Foo (BazID, Description)
output inserted.FooID into @GeneratedFooIDList
select
FT.BazID,
FT.Description
from FooTemplate as FT
where
FT.NextGenerationDate < @Date
insert Bar (FooID, Description)
select
G.FooID,
BT.Description
from @GeneratedFooIDList as G
inner join Foo as F on F.FooID = G.FooID
inner join FooTemplate as FT on FT.BazID = F.BazID and FT.Description = F.Description
inner join BarTemplate as BT on BT.FooTemplateID = FT.FooTemplateID
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
343 次 |
| 最近记录: |