Код, який subquery
ви маєте у своєму коді, називається похідною таблицею . Це не базова таблиця, а таблиця, яка "живе" під час запуску запиту. Як і представлення (які також називаються переглянуті таблиці ) - а в останніх версіях CTE - це ще один, четвертий спосіб "визначення" таблиці всередині запиту - вони багато в чому схожі на таблицю. Ви можете select
з них, ви можете використовувати їх у from
або вjoin
до інших таблиць (базових чи ні!).
У деяких СУБД (не всі СУБД реалізували це однаково) ці таблиці / представлення можна оновити . І «оновлювані» означає , що ми можемо також update
, insert
в абоdelete
з них.
Однак існують обмеження, і цього очікується. Уявіть, чи subquery
було поєднання 2 (або 17 таблиць). Що б delete
тоді означало? (з яких таблиць слід видалити рядки?) Оновлені погляди - справа дуже складна . Існує недавня (2012) книга, повністю на цю тему, написана Крісом Датеєм, добре відомим знавцем реляційної теорії: Перегляд оновлення та реляційної теорії .
Коли похідна таблиця (або представлення) є дуже простим запитом, як-от у неї є лише одна базова таблиця (можливо обмежена а WHERE
), і ні GROUP BY
, то кожен рядок похідної таблиці відповідає одному рядку в базовій базовій таблиці, так що це легко * оновити, вставити або видалити з цього.
Коли код всередині підзапиту є більш складним, це залежить від того, чи можна відстежувати / вирішувати рядки похідної таблиці / перегляду до рядків з однієї з базових базових таблиць.
Для SQL Server, ви можете прочитати в пункті оновлюваних уявлень в MSDN: CREATE VIEW
.
Оновлені перегляди
Ви можете змінювати дані базової базової таблиці за допомогою перегляду, якщо виконуються такі умови:
Будь-які зміни, включаючи UPDATE
, INSERT
та DELETE
заяви, повинні посилатися на стовпці лише з однієї базової таблиці.
Стовпці, що змінюються у представленні даних, повинні безпосередньо посилатися на базові дані у стовпцях таблиці. Стовпці неможливо отримати жодним іншим способом, наприклад, за допомогою наступного:
Агрегатна функція: AVG
, COUNT
, SUM
, MIN
, MAX
, GROUPING
, STDEV
, STDEVP
, VAR
, і VARP
.
Обчислення. Стовпець не можна обчислити з виразу, який використовує інші стовпці. Стовпці, які сформовані з використанням набору операторів UNION
, UNION ALL
, CROSSJOIN
, EXCEPT
, і INTERSECT
кількості до обчислення і також не оновлювані.
Стовпці модифікуються не впливає GROUP BY
, HAVING
або DISTINCT
положення.
TOP
не використовується ніде в select_statement перегляду разом із WITH CHECK OPTION
пунктом.
Попередні обмеження поширюються на будь-які підзапити в FROM
пункті перегляду, так само як вони стосуються самого виду. Як правило, двигун бази даних повинен мати можливість однозначно відстежувати модифікації від визначення перегляду до однієї базової таблиці.
Насправді delete
легше, менш складне, ніж update
. Для SQL Server потрібні лише первинні ключі або інший спосіб визначити, які рядки базової таблиці потрібно видалити. Тому що update
існує додаткове (досить очевидне) обмеження, яке ми не можемо оновити обчислений стовпець. Ви можете спробувати змінити запит, щоб зробити оновлення. Оновлення CreatedDateTime
, ймовірно, спрацює нормально, але спроба оновити обчислений RowNumber
стовпець призведе до помилки. І insert
ще складніше, оскільки нам доведеться надати значення для всіх стовпців базової таблиці, які не мають DEFAULT
обмежень.