虽然通过视图、子查询可实现与表表达式等同的功能,但表表达式简化查询的公式,使得语法更加灵活和直观,并支持 SQL 的 ANSI/ISO 标准。
查询优化器不具体化 FROM 子句指定的简单的表表达式。与使用 GBase 8s 扩展 TABLE (MULTISET ( SELECT ... )) 语法来在 FROM 子句中指定等同的派生的表的查询的性能比起来,在 FROM 子句中对表表达式使用 ANSI/ISO 语法的查询的性能至少一样好,设置如 UNION、INTERSECT 或 MINUS 操作符 这样的操作符,或将 ORDER BY 规范作为复合的表表达式实现,可造成比简单的表表达式更大的开销。请使用 SET EXPLAIN 语句来检测查询计划和表表达式的预计成本。
SELECT * FROM (SELECT * FROM t); SELECT * FROM (SELECT * FROM t) AS s; SELECT * FROM (SELECT * FROM t) AS s WHERE t.a = s.b; SELECT * FROM (SELECT * FROM t) AS s, (SELECT * FROM u) AS v WHERE s.a = v.b; SELECT * FROM (SELECT SKIP 2 col1 FROM tab1 WHERE col1 > 50 ORDER BY col1 DESC); SELECT * FROM (SELECT col1,col3 FROM tab1 WHERE col1 < 50 GROUP BY col1,col3 ORDER BY col3 ) vtab(vcol0,vcol1); SELECT * FROM (SELECT * FROM t WHERE t.a = 1) AS s, OUTER (SELECT * FROM u WHERE u.b = 2 GROUP BY 1) AS v WHERE s.a = v.b; SELECT * FROM (SELECT a AS colA FROM t WHERE t.a = 1) AS s, OUTER (SELECT b AS colB FROM u WHERE u.b = 2 GROUP BY 1) AS v WHERE s.colA = v.colB; CREATE VIEW vu AS SELECT * FROM (SELECT * FROM t); SELECT * FROM ((SELECT * FROM t) AS r) AS s;