Вставка таблицы в представление SQL Server - PullRequest
2 голосов
/ 19 июля 2011

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

CREATE VIEW view_name AS SELECT * FROM table1_name

Когда я делаю это, если я изменяю table1_name, эти изменения отражаются в представлении (как я хочу).Однако позже я создаю таблицу table2_name и хочу добавить ее в это представление таким же образом, чтобы, если я добавлю строки в таблицу, они были отражены в представлении.Итак, я использую похожий фрагмент кода (но вместо этого использую insert)

INSERT INTO view_name SELECT * FROM table2_name

Однако теперь, когда я добавляю к table2_name, они не отражаются в представлении.Я чрезвычайно новичок в SQL (начался три дня назад), поэтому любые мысли или места, на которые я должен обратить внимание, были бы чрезвычайно полезны.

(Примечание: я использую SQL Server, мне кажется, чтоимеет большое значение, но в случае, если это так)

Спасибо, SaxyTimmy

Ответы [ 4 ]

6 голосов
/ 19 июля 2011

Возможно, что вы хотели сделать (при условии, что столбцы одинаковые):

ALTER VIEW view_name
AS
    SELECT col1, col2 FROM table1_name
    UNION ALL
    SELECT col1, col2 FROM table2_name

Как указал Джо, вы не вставляете данные в представление - они не сохраняются (если только они не проиндексированы, и в этом случае вы фактически не вставляете в представление).

Если вы хотите обновить представление для новых таблиц, вы можете сделать что-то вроде этого. Я предполагаю, что вы работаете на SQL Server 2005 или выше - если ваша школа учит вас SQL Server 2000, позор им. Я также предполагаю пару других вещей ... ваш взгляд не содержит завершающего оператора-терминатора (единственный раз, когда я бы выступал за его исключение), и что у вас нет всякой ерунды в комментариях раньше команда CREATE VIEW.

CREATE PROCEDURE dbo.AddTableToView
    @view      SYSNAME,
    @new_table SYSNAME
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @sql NVARCHAR(MAX);

    SELECT @sql = [definition] FROM sys.sql_modules
        WHERE [object_id] = OBJECT_ID(@view);

    SELECT @sql = STUFF(@sql, CHARINDEX('CREATE VIEW', @sql), 6, 'ALTER')
        + 'UNION ALL
           SELECT col1, col2 FROM ' + @new_table;

    EXEC sp_executeSQL @sql;
END
GO

Но, как я предположил в комментариях, это действительно не тот путь, которым вы хотели, и я подозреваю, что ваш профессор будет чувствовать то же самое.

3 голосов
/ 19 июля 2011

Я думаю, что вы неправильно понимаете, что такое точка зрения. Представление - это просто сохраненный запрос. Вы фактически не вставляете строки в представление. Хотя у вас может быть обновляемое представление, оно вставляет строки в базовую таблицу.

Если вы хотите добавить table2_name к представлению, вам нужно изменить это определение представления. Если столбцы точно совпадают с table1_name, вы можете сделать что-то вроде:

ALTER VIEW view_name
AS
    SELECT
        *
    FROM
        table1_name
    UNION ALL
    SELECT
        *
    FROM
        table2_name

В качестве альтернативы вы можете DROP и CREATE просматривать с новым определением вместо использования синтаксиса ALTER.

Кроме того, когда вы говорите: «если я внесу изменения в table1_name», вы имеете в виду вставку строк или добавление столбцов?

3 голосов
/ 19 июля 2011

Вы не можете вставлять данные в представление так, как вы думаете. Когда вы запускаете оператор вставки, вы фактически вставляете данные в базовую таблицу (table1_name), на которую ссылается представление. Вы не создаете какую-то связь между представлением и строками table2_name.

2 голосов
/ 19 июля 2011

Вы не можете вставить данные в представление. Ваша вставка вставляет данные в таблицу table1_name. (См. Обновляемые и вставляемые представления )

Если вам нужны данные как table1_name, так и table2_name, то в select должны быть оба значения table1_name и table2_name, на основе которых создается представление.

Для этого вы можете использовать либо UNION* (если обе запрашиваемые таблицы имеют одинаковые столбцы no / type / set):

CREATE VIEW view_name AS
SELECT * FROM table1_name
UNION
SELECT * FROM table2_name

Для этого необходимо, чтобы table1_name и table2_name имели одинаковое количество и типы столбцов в одинаковом порядке

Или Вы можете объединиться с другой таблицей и получить все столбцы (или их подмножество):

CREATE VIEW view_name AS
SELECT * 
FROM table1_name join table2_name on some_column

*UNION удаляет дубликаты между двумя запросами выбора. UNION ALL - лучший вариант, если вы уверены, что данные из обеих таблиц являются взаимоисключающими, или если вы в порядке с дублирующимися строками. UNION ALL работает лучше.

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