声明表时默认使用select语句

时间:2019-02-13 08:54:35

标签: sql sql-server database

我想在声明表时为列设置默认值,但是该值不是常数,实际上它是基于另一个表中的其他数据。 我有兴趣知道下面的代码是否是SQL-server这样的东西:

create table Test_Table(
Id int primary key ,
Name varchar(50),
Sum int default (select Count(*) from AnotherTable where Condition)
)

2 个答案:

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

我将其作为内部联接,假设您在示例中使用的“条件”暗示了两个不同表之间的某种关系

您可以从视图中进行选择,就像从表格中进行选择一样。