如何将一个 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。
我有三张桌子。我们称它们为 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。