Конструктор значений таблицы

Синтаксис конструктора значений таблицы:

VALUES
(<элемент конструктора>, <элемент конструктора>, ...),
(<элемент конструктора>, <элемент конструктора>, ...),
...
(<элемент конструктора>, <элемент конструктора>, ...)

При этом элементом конструктора может быть:

  • выражение, вычисляющее значение, совместимое с типом данных соответствующего столбца таблицы;

  • DEFAULT - для подстановки значения по умолчанию для соответствующего столбца таблицы;

  • NULL;

  • подзапрос, возвращающий одно значение, совместимое с типом данных соответствующего столбца таблицы.

Конструктор значений таблицы может использоваться для вставки набора строк в существующую таблицу с помощью одного оператора INSERT.

Создадим следующую таблицу для выполнения примеров:

CREATE TABLE Items (
item_no int primary key,
maker char(10),
type char(10) default 'PC',
value int
);

Вставим в таблицу 4 строки, используя конструктор.

INSERT INTO Items VALUES
(1, 'A', 'Laptop', 12),
(2, 'B', DEFAULT, NULL),
(3, 'C', 'Printer', (select CAST(model as int) from Printer where code=1)),
(4, 'C', 'Printer', (select CAST(model as int) from Printer where code=77));
select * from Items;
item_nomakertypevalue
1ALaptop12
2BPCNULL
3CPrinter3001
4CPrinterNULL

Последнее значение в двух последних строках было получено с помощью подзапроса, который возвращает либо одно значение (поскольку выполняется отбор по ключу) с номером модели из таблицы Printer, либо ни одного. Последнее имеет место для четвертой строки, поскольку коду 77 не отвечает никакая строка таблицы Printer. В этом случае будет записано NULL-значение.

Конструктор значений таблицы может использоваться также в предложении FROM. В параграфе, посвященном генерации числовой последовательности, последний пример, который находит 100 последовательных незанятых номеров моделей, с учетом этой возможности можно переписать более компактно:

SELECT (SELECT MAX(model)
    FROM Product
    ) + 5*5*(a-1) + 5*(b-1) + c AS num
    FROM
    (VALUES(1),(2),(3),(4),(5)) x(a) CROSS JOIN
    (VALUES(1),(2),(3),(4),(5)) y(b)  CROSS JOIN
    (VALUES(1),(2),(3),(4),(5)) z(c)
    WHERE 5*5*(a-1) + 5*(b-1) + c <= 100
    ORDER BY 1;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]

Еще один пример использования конструктора значений таблицы для трансформации строки в столбец можно увидеть в главе, посвященной оператору CROSS APPLY.