Spec-Zone .ru
спецификации, руководства, описания, API

13.2.10.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) если подзапрос не производит строк. Ошибка происходит, если подзапрос производит многократные строки, потому что подзапрос строки может возвратить самое большее одну строку.

Выражения (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);