如何将一个表中的NEW值与另一个表中的值一起添加到第三个表中?

时间:2015-07-30 15:38:14

标签: sql sql-server sql-insert bulkinsert

我有三张桌子。我们称之为数据,期间和类型。数据包含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都是相当小的表。

3 个答案:

答案 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;