Spec-Zone .ru
спецификации, руководства, описания, API
|
Обсуждение к этой точке имело подзапросы столбца или скаляр; то есть, подзапросы, которые возвращают единственное значение или столбец значений. Подзапрос строки является разновидностью подзапроса, которая возвращает единственную строку и может таким образом возвратить больше чем одно значение столбца. Юридические операторы для сравнений подзапроса строки:
= > < >= <= <> != <=>
Вот два примера:
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);