15.2.15.5 Подзапросы с строками
Скалярные или столбцовые подзапросы возвращают одно значение или столбец значений. Подзапрос со строкой — это разновидность подзапроса, которая возвращает одну строку и, следовательно, может возвращать более одного значения столбца. Допустимые операторы для сравнения подзапросов со строкой:
= > < >= <= <> != <=>
Вот два примера:
SELECT * FROM t1
WHERE (col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
SELECT * FROM t1
WHERE ROW(col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
В обоих запросах, если таблица t2 содержит одну строку с id = 10, подзапрос возвращает одну строку. Если эта строка имеет значения col3 и col4, равные значениям col1 и col2 любых строк в t1, выражение WHERE равно TRUE, и каждый запрос возвращает эти t1 строки. Если значения t2 строки col3 и col4 не равны значениям col1 и col2 любой строки t1, выражение равно FALSE, и запрос возвращает пустой результат. Выражение является неизвестным (то есть NULL), если подзапрос не возвращает строк. Возникает ошибка, если подзапрос возвращает несколько строк, поскольку подзапрос со строкой может возвращать не более одной строки.
Сведения о работе каждого оператора при сравнении строк см. в разделе 14.4.2 «Функции и операторы сравнения».
Выражения (1,2) и ROW(1,2) иногда называются конструкциями строк. Эти два выражения эквивалентны. Конструктор строки и строка, возвращаемая подзапросом, должны содержать одинаковое количество значений.
Конструктор строки используется для сравнения с подзапросами, которые возвращают два или более столбцов. Когда подзапрос возвращает один столбец, это рассматривается как скалярное значение, а не как строка, поэтому конструктор строки нельзя использовать с подзапросом, который не возвращает как минимум два столбца. Таким образом, следующий запрос завершится синтаксической ошибкой:
SELECT * FROM t1 WHERE ROW(1) = (SELECT column1 FROM t2)
Конструкторы строк допустимы и в других контекстах. Например, следующие два утверждения семантически эквивалентны (и обрабатываются оптимизатором одинаково):
SELECT * FROM t1 WHERE (column1,column2) = (1,1);
SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;
Следующий запрос отвечает на запрос “найти все строки в таблице t1, которые также существуют в таблице t2”:
SELECT column1,column2,column3
FROM t1
WHERE (column1,column2,column3) IN
(SELECT column1,column2,column3 FROM t2);
Дополнительные сведения об оптимизаторе и конструкторах строк см. в разделе 10.2.1.22 «Оптимизация выражения конструктора строк»
© 2025 Oracle
Licensed under the GPLv2 License.