复合查询¶
复合查询语句将多个线性查询语句的结果集合并在一起。
限制条件¶
要合并的线性查询语句必须满足以下限制条件:
- 传给线性查询语句的结果集的数据类型必须相同。
-
线性查询语句的结果集(例如,A 和 B)必须由同名且可合并的列构成,即必须满足以下条件:
- 结果集 A 和 B 具有相同数量的列。
- 结果集 A 中的每一列,在结果集 B 中存在同名的列;反之亦然。
- 结果集 A 和 B 中所有列的顺序相同。
- 结果集 A 和 B 中的每一组同名列,其数据类型是可比较的。更多信息,请参见比较谓词。
语法¶
- composite_query_statement
- query_conjunction
composite_query_statement ::=
linear_query_statement query_conjunction linear_query_statement ( query_conjunction linear_query_statement )*
query_conjunction ::=
'UNION' ('DISTINCT' | 'ALL')?
| 'EXCEPT' ('DISTINCT' | 'ALL')?
| 'INTERSECT' ('DISTINCT' | 'ALL')?
参数¶
UNION | EXCEPT | INTERSECT¶
合并两个查询的结果集时使用的集合运算符。
UNION:将两个查询结果集中的所有行合并为一个结果集。EXCEPT:仅返回第一个结果集中存在、且第二个结果集中不存在的行。INTERSECT:仅返回两个结果集中都存在的行。
DISTINCT | ALL¶
是否删除结果集中的重复出现的行。
DISTINCT:默认值,删除结果集中的重复行。ALL:保留结果集中的所有行,包括重复行。
linear_query_statement¶
由一组简单查询语句组成的线性查询语句。更多信息,请参见线性查询语句。
示例¶
使用UNION DISTINCT合并两个查询¶
'''
FOR i IN LIST[4,1,2,3,3] RETURN i
UNION DISTINCT
FOR i IN LIST[11,2,2,22,33,33] RETURN i ORDER BY i OFFSET 1 LIMIT 2
'''
返回:
+----+
| i |
+----+
| 4 |
| 1 |
| 2 |
| 3 |
| 11 |
+----+
使用UNION ALL合并两个查询¶
'''
FOR i IN LIST[4,1,2,3,3] RETURN i
UNION ALL
FOR i IN LIST[11,2,2,22,33,33] RETURN i ORDER BY i OFFSET 1 LIMIT 2
'''
返回:
+----+
| i |
+----+
| 4 |
| 1 |
| 2 |
| 3 |
| 3 |
| 2 |
| 11 |
+----+
使用EXCEPT DISTINCT合并两个查询¶
'''
FOR i IN LIST[1,2,3,4] RETURN i AS num
EXCEPT DISTINCT
FOR i IN LIST[2,4] RETURN i AS num
ORDER BY num
'''
返回:
+-----+
| num |
+-----+
| 1 |
| 3 |
+-----+
使用EXCEPT ALL合并两个查询¶
'''
FOR i IN LIST[4,1,2,3,2,3] RETURN i
EXCEPT ALL
FOR i IN LIST[11,2,2,22,33,33] RETURN i ORDER BY i OFFSET 1 LIMIT 2
'''
返回:
+---+
| i |
+---+
| 4 |
| 1 |
| 3 |
| 3 |
+---+
使用INTERSECT DISTINCT合并两个查询¶
'''
FOR i IN LIST[1,2,3,4] RETURN i AS num
INTERSECT DISTINCT
FOR i IN LIST[3,4,5] RETURN i AS num
ORDER BY num
'''
返回:
+-----+
| num |
+-----+
| 3 |
| 4 |
+-----+
使用INTERSECT ALL合并两个查询¶
'''
FOR i IN LIST[4,1,2,3,2,3] RETURN i
INTERSECT ALL
FOR i IN LIST[11,2,2,22,33,33] RETURN i ORDER BY i OFFSET 1 LIMIT 2
'''
返回:
+---+
| i |
+---+
| 2 |
| 2 |
+---+