添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
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 ) 如果子查询不产生任何行。如果子查询产生多行,则会发生错误,因为行子查询最多只能返回一行。 有关每个运算符如何用于行比较的信息,请参阅 第 12.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);

有关优化器和行构造函数的更多信息,请参阅 第 8.2.1.22 节,“行构造函数表达式优化”