我想在声明表时为列设置默认值,但是该值不是常数,实际上它是基于另一个表中的其他数据。 我有兴趣知道下面的代码是否是SQL-server这样的东西:
create table Test_Table(
Id int primary key ,
Name varchar(50),
Sum int default (select Count(*) from AnotherTable where Condition)
)
答案 0 :(得分:2)
您不能添加依赖于其他表的DEFAULT
约束。
请注意,您正在尝试存储可能为冗余的计算列(从规范化的角度来看)。当计算非常繁琐且无法按需进行时,通常是执行此操作的常用方法。
您有一些解决方法,每个都有优点和缺点:
使用视图,该视图会在每次需要时计算该值。对于一个视图,该值实际上并未存储,而是在使用该值的每个查询中计算得出的,因此您不必保持更新。如果您要从原始表中添加/删除列,则需要从视图中添加/删除列。
CREATE VIEW dbo.vTest_Table
AS
SELECT
T.Id,
T.Name,
Sum = (SELECT COUNT(*) FROM AnotherTable AS A WHERE /*Condition linking T with A*/)
FROM
Test_Table AS T
使用触发器来使跟踪表中的值保持更新。这意味着只要要计算的表达式发生变化,就需要添加该列并保持更新。每次完成更改后,与其他解决方案相比,这会增加处理开销,但是选择该值将更快,因为它已经计算出来。也有可能被索引。
CREATE TRIGGER utrTestTableUpdateSum ON AnotherTable -- Trigger on the other table!!
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
;WITH AffectedRows AS
(
SELECT KeyColumn FROM inserted
UNION
SELECT KeyColumn FROM deleted
),
Aggregates AS
(
SELECT
T.KeyColumn,
COUNT(*)
FROM
AnotherTable AS T
INNER JOIN AffectedRows AS A ON A.KeyColumn = T.KeyColumn
GROUP BY
T.KeyColumn
)
UPDATE T SET
Sum = /* Expression */
FROM
Aggregates AS A
INNER JOIN Test_Table AS T ON /*Joining columns*/
END
答案 1 :(得分:0)
表是静态数据,所描述的是动态数据,需要一个视图:
create table mytable
(
id int primary key,
name varchar(50)
);
create view myview
as
select t1.*, t3.thecount
from mytable t1
inner join
(
select t2.something, count(t2.*)
from othertable t2
group by t2.something
) t3
on t1.id = t2.something
我将其作为内部联接,假设您在示例中使用的“条件”暗示了两个不同表之间的某种关系
您可以从视图中进行选择,就像从表格中进行选择一样。