использовать оператор выбора по умолчанию при объявлении таблицы - PullRequest
0 голосов
/ 13 февраля 2019

Я хочу установить значение по умолчанию для столбца при объявлении таблицы, но значение не является постоянным, на самом деле оно основано на некоторых других данных из другой таблицы.Мне интересно знать, есть ли такая вещь, как код ниже SQL-сервер:

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

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Нельзя добавить ограничение 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
    
0 голосов
/ 13 февраля 2019

Таблицы являются статическими данными, то, что вы описываете, является динамическим, вам нужно представление:

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

Я поместил это как внутреннее соединение, предполагая, что «условие», которое вы использовали в вашем примереподразумевает какое-то отношение между вашими двумя различными таблицами

Вы можете выбирать из представления так же, как выбираете из таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...