我有三张桌子。我们称之为数据,期间和类型。数据包含Type中每条记录的记录和Period中的每条记录,因此Data的长度是Period的长度乘以Type的长度。
Type:
TypeID(primary key int)
TypeName(vchar)
Period:
PeriodID(primary key int)
PeriodName(varchar)
Data:
DataID(primary key int)
PeriodID(relational int)
TypeID(relational int)
Value(int)
有时会将新值添加到Period,但Type在可预见的将来应保持不变。我想要做的是为每个新的Period(Data还没有包含的PeriodID)在Data中插入新记录,每个TypeID一个。因此,如果有5个新的Period记录和6个Type记录,则Data应该有30个新条目。我不确定如何用SQL简洁地完成这项工作。性能不是问题,因为Period和Type都是相当小的表。
答案 0 :(得分:2)
笛卡尔积和子查询应该做你想做的事:
insert into Data (PeriodID, TypeID)
select PeriodID, TypeID
from Period, Type
where PeriodID not in (select PeriodID from Data)
请注意,假定您的DataID列是自动生成的,Value列将为null(因此需要为空)。如果不是这种情况,您可能需要更改SQL。
答案 1 :(得分:1)
听起来你正在寻找一个跨产品
INSERT INTO Data
SELECT P.PeriodID, T.TypeID, 'some value' AS Value
FROM Period P
CROSS JOIN Type T
结果的快速示例
DECLARE @Period TABLE (
PeriodID int
)
DECLARE @Type TABLE (
TypeID int
)
insert into @Period
VALUES
(1),(2),(3)
insert into @Type
VALUES
(4),(5),(6)
SELECT P.PeriodID, T.TypeID, 'some value' AS Value
FROM @Period P
CROSS JOIN @Type T
结果
1 4 some value
2 4 some value
3 4 some value
1 5 some value
2 5 some value
3 5 some value
1 6 some value
2 6 some value
3 6 some value
答案 2 :(得分:1)
插入Period表后,您可以使用statement:
insert into Data(PeriodID,TypeID, Value)
select scope_identity(), TypeId, @DefaultValue From Type;
或者如果在将每个新值插入到事务中的Period表后无法添加,则可以使用触发器:
insert into Data(PeriodID,TypeID, Value)
select i.PeriodID, t.TypeId, @DefaultValue from inserted i cross join Type t
请注意,假设您的DataID列是自动生成的,而Value列将填充变量@DefaultValue的值,您必须在语句之前声明如下:
declare @DefaultValue int = 0;