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

How do I add NEW values in one table along with the values in another table to a third table?

我有三张桌子。我们称它们为 Data、Period 和 Type。 Data包含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(数据尚未包含的 PeriodID)将新记录插入到 Data 中,每个 TypeID 一个。因此,如果有 5 个新的 Period 记录和 6 个 Type 记录,Data 应该有 30 个新条目。我不确定如何用 SQL 简洁地做到这一点。性能不是问题,因为 Period 和 Type 都是相当小的表。

听起来您正在寻找叉积

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

在插入 Period table 之后,您可以使用语句:

insert into Data(PeriodID,TypeID, Value) 
select scope_identity(), TypeId, @DefaultValue From Type;

或者如果无法在将每个新值插入交易期间 table 后添加,您可以使用触发器:

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;

笛卡尔积和子查询应该做你想做的事:

insert into Data (PeriodID, TypeID)
select PeriodID, TypeID
from Period, Type
where PeriodID not in (select PeriodID from Data)

请注意,假设您的 DataID 列是自动生成的,并且 Value 列将为空(因此需要可以为空)。如果不是这种情况,您可能需要更改 SQL。