Source: https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/composite-query/ Documentation version: v5.3.2 # 复合查询 复合查询语句将多个线性查询语句的结果集合并在一起。 ## 限制条件 要合并的线性查询语句必须满足以下限制条件: - 传给线性查询语句的结果集的数据类型必须相同。 - 线性查询语句的结果集(例如,A 和 B)必须由同名且可合并的列构成,即必须满足以下条件: - 结果集 A 和 B 具有相同数量的列。 - 结果集 A 中的每一列,在结果集 B 中存在同名的列;反之亦然。 - 结果集 A 和 B 中所有列的顺序相同。 - 结果集 A 和 B 中的每一组同名列,其数据类型是可比较的。更多信息,请参见[比较谓词](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/predicates/comparison/)。 ## 语法 语法图源码 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` 由一组简单查询语句组成的线性查询语句。更多信息,请参见[线性查询语句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/linear-query/)。 ## 示例 ### 使用`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 | +---+ ````