15.2.15.1 Подзапрос как скалярный операнд
В самом простом виде подзапрос — это скалярный подзапрос, возвращающий одно значение. Скалярный подзапрос — это простой операнд, и вы можете использовать его почти везде, где допустимо одиночное значение столбца или литерал, и можете ожидать, что он будет обладать теми же характеристиками, что и все операнды: тип данных, длина, указание на то, что он может быть NULL, и так далее. Например:
CREATE TABLE t1 (s1 INT, s2 CHAR(5) NOT NULL);
INSERT INTO t1 VALUES(100, 'abcde');
SELECT (SELECT s2 FROM t1);
Подзапрос в этом SELECT возвращает одно значение ('abcde'), имеющее тип данных CHAR, длину 5, набор символов и сортировку, равные значениям по умолчанию, установленным во время CREATE TABLE, и указание на то, что значение в столбце может быть NULL. Нулевая разрешенность значения, выбранного скалярным подзапросом, не копируется, потому что если результат подзапроса пустой, результат — NULL. Для показанного подзапроса, если t1 было бы пустым, результатом было бы NULL, даже если s2 является NOT NULL.
Есть несколько контекстов, в которых скалярный подзапрос нельзя использовать. Если оператор допускает только литеральное значение, вы не можете использовать подзапрос. Например, LIMIT требует целочисленных литералов в качестве аргументов, а LOAD
DATA требует литерального имени файла в строковом формате. Вы не можете использовать подзапросы для предоставления этих значений.
Когда вы видите примеры в следующих разделах, содержащие довольно сжатую конструкцию (SELECT column1 FROM
t1), представьте, что ваш собственный код содержит гораздо более разнообразные и сложные конструкции.
Предположим, что мы создаем две таблицы:
CREATE TABLE t1 (s1 INT);
INSERT INTO t1 VALUES (1);
CREATE TABLE t2 (s1 INT);
INSERT INTO t2 VALUES (2);
Затем выполните SELECT:
SELECT (SELECT s1 FROM t2) FROM t1;
Результатом является 2, потому что в t2 есть строка, содержащая столбец s1, имеющий значение 2.
Предыдущий запрос также можно записать так, используя TABLE:
SELECT (TABLE t2) FROM t1;
Скалярный подзапрос может быть частью выражения, но помните о скобках, даже если подзапрос является операндом, предоставляющим аргумент для функции. Например:
SELECT UPPER((SELECT s1 FROM t1)) FROM t2;
Тот же результат можно получить, используя SELECT
UPPER((TABLE t1)) FROM t2.
© 2025 Oracle
Licensed under the GPLv2 License.