集合操作

Batch Streaming

UNION

UNIONUNION ALL 返回两个表中的数据。 UNION 会去重,UNION ALL 不会去重。

  1. Flink SQL> create view t1(s) as values ('c'), ('a'), ('b'), ('b'), ('c');
  2. Flink SQL> create view t2(s) as values ('d'), ('e'), ('a'), ('b'), ('b');
  3. Flink SQL> (SELECT s FROM t1) UNION (SELECT s FROM t2);
  4. +---+
  5. | s|
  6. +---+
  7. | c|
  8. | a|
  9. | b|
  10. | d|
  11. | e|
  12. +---+
  13. Flink SQL> (SELECT s FROM t1) UNION ALL (SELECT s FROM t2);
  14. +---+
  15. | c|
  16. +---+
  17. | c|
  18. | a|
  19. | b|
  20. | b|
  21. | c|
  22. | d|
  23. | e|
  24. | a|
  25. | b|
  26. | b|
  27. +---+

INTERSECT

INTERSECTINTERSECT ALL 返回两个表中共有的数据。 INTERSECT 会去重,INTERSECT ALL 不会去重。

  1. Flink SQL> (SELECT s FROM t1) INTERSECT (SELECT s FROM t2);
  2. +---+
  3. | s|
  4. +---+
  5. | a|
  6. | b|
  7. +---+
  8. Flink SQL> (SELECT s FROM t1) INTERSECT ALL (SELECT s FROM t2);
  9. +---+
  10. | s|
  11. +---+
  12. | a|
  13. | b|
  14. | b|
  15. +---+

EXCEPT

EXCEPTEXCEPT ALL 返回在一个表中存在,但在另一个表中不存在数据。 EXCEPT 会去重,EXCEPT ALL不会去重。

  1. Flink SQL> (SELECT s FROM t1) EXCEPT (SELECT s FROM t2);
  2. +---+
  3. | s |
  4. +---+
  5. | c |
  6. +---+
  7. Flink SQL> (SELECT s FROM t1) EXCEPT ALL (SELECT s FROM t2);
  8. +---+
  9. | s |
  10. +---+
  11. | c |
  12. | c |
  13. +---+

IN

如果表达式(可以是列,也可以是函数等)存在于子查询的结果中,则返回 true。子查询的表结果必须由一列组成。此列必须与表达式具有相同的数据类型。

  1. SELECT user, amount
  2. FROM Orders
  3. WHERE product IN (
  4. SELECT product FROM NewProducts
  5. )

优化器会把 IN 条件重写为 join 和 group 操作。对于流式查询,计算查询结果所需的状态可能会根据输入行数而无限增长。你可以设置一个合适的状态 time-to-live(TTL)来淘汰过期数据以防止状态过大。注意:这可能会影响查询结果的正确性。详情参见:查询配置

EXISTS

  1. SELECT user, amount
  2. FROM Orders
  3. WHERE product EXISTS (
  4. SELECT product FROM NewProducts
  5. )

如果子查询返回至少一行,则为 true。只支持能被重写为 join 和 group 的操作。

优化器会把 EXIST 重写为 join 和 group 操作.对于流式查询,计算查询结果所需的状态可能会根据输入行数而无限增长。你可以设置一个合适的状态 time-to-live(TTL)来淘汰过期数据以防止状态过大。注意:这可能会影响查询结果的正确性。详情参见:查询配置