[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The discussion to this point has been of column (or scalar) subqueries -- subqueries which return a single column value. A row subquery is a subquery variant that returns a single row value -- and may thus return more than one column value. Here are two examples:
SELECT * FROM t1 WHERE (1,2) = (SELECT column1, column2 FROM t2); SELECT * FROM t1 WHERE ROW(1,2) = (SELECT column1, column2 FROM t2); |
The queries above are both TRUE
if table t2
has
a row where column1 = 1
and column2 = 2
.
The expression (1,2)
is sometimes called a row constructor
and is legal in other contexts too. For example
SELECT * FROM t1 WHERE (column1,column2) = (1,1); |
is equivalent to
SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1; |
The normal use of row constructors, though, is for comparisons with subqueries that return two or more columns. For example, this query answers the request: "find all rows in table t1 which are duplicated in table t2":
SELECT column1,column2,column3 FROM t1 WHERE (column1,column2,column3) IN (SELECT column1,column2,column3 FROM t2); |