跳转至
开发版采用单机部署,无需产品 License 文件。需要多机部署或大规模性能测试? 了解企业版

复合查询

复合查询语句将多个线性查询语句的结果集合并在一起。

限制条件

要合并的线性查询语句必须满足以下限制条件:

  • 传给线性查询语句的结果集的数据类型必须相同。
  • 线性查询语句的结果集(例如,A 和 B)必须由同名且可合并的列构成,即必须满足以下条件:

    • 结果集 A 和 B 具有相同数量的列。
    • 结果集 A 中的每一列,在结果集 B 中存在同名的列;反之亦然。
    • 结果集 A 和 B 中所有列的顺序相同。
    • 结果集 A 和 B 中的每一组同名列,其数据类型是可比较的。更多信息,请参见比较谓词。

语法

composite_query_statement
linear_query_statement query_conjunction linear_query_statement query_conjunction
query_conjunction
UNION DISTINCT ALL EXCEPT DISTINCT ALL INTERSECT DISTINCT ALL

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 |
+---+