Skip to content

Commit

Permalink
docs: update for LEFT JOIN
Browse files Browse the repository at this point in the history
  • Loading branch information
aceforeverd committed Nov 3, 2023
1 parent 59c36bc commit 0786574
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,12 @@ OpenMLDB仅支持上线[SELECT查询语句](../dql/SELECT_STATEMENT.md)。

| SELECT 子句 | 说明 |
| :--------------------------------------- | :----------------------------------------------------------- |
| 无表查询 | SELECT 没有 FROM 子句, 只做表达式计算 |
| 单张表的简单表达式计算 | 简单的单表查询是对一张表进行列运算、使用运算表达式或单行处理函数(Scalar Function)以及它们的组合表达式作计算。需要遵循[在线请求模式下单表查询的使用规范](#在线请求模式下单表查询的使用规范) |
| [`JOIN` 子句](../dql/JOIN_CLAUSE.md) | OpenMLDB目前仅支持**LAST JOIN**。需要遵循[在线请求模式下LAST JOIN的使用规范](#在线请求模式下-last-join-的使用规范) |
| [`WINDOW` 子句](../dql/WINDOW_CLAUSE.md) | 窗口子句用于定义一个或者若干个窗口。窗口可以是有名或者匿名的。用户可以在窗口上调用聚合函数进行分析计算。需要遵循[在线请求模式下Window的使用规范](#在线请求模式下window的使用规范) |

## 在线请求模式下 `SELECT` 子句的使用规范

### 无表查询

```sql
SELECT sin(30) as out;
```



### 在线请求模式下单表查询的使用规范

- 仅支持列运算,表达式,以及单行处理函数(Scalar Function)以及它们的组合表达式运算。
Expand Down Expand Up @@ -71,11 +62,12 @@ SELECT substr(COL7, 3, 6) FROM t1;
3. 带排序LAST JOIN的情况下,`ORDER BY`只支持单列的列引用表达式,列类型为 int16, int32, int64 or timestamp, **并且列需要命中右表索引的时间列**。满足条件 2 和 3 的情况我们简单称做表能被 LAST JOIN 的 JOIN 条件优化
4. 右表 TableRef
- 可以指一张物理表, 或者子查询语句
- 子查询情况, 只支持
- 子查询情况, 目前支持
- 简单列筛选 (`select * from tb` or `select id, val from tb`)
- 窗口聚合子查询, 例如 `select id, count(val) over w as cnt from t1 window w as (...)`. 这种情况下, 子查询和 last join 的左表必须有相同的主表, 主表指计划树下最左边的物理表节点.
- 窗口聚合子查询, 例如 `select id, count(val) over w as cnt from t1 window w as (...)`.
- **Since OpenMLDB 0.8.0** 带 WHERE 条件过滤的简单列筛选 ( 例如 `select * from tb where id > 10`)
- **Since OpenMLDB 0.8.4** 右表是带 LAST JOIN 的子查询 `subquery`, 要求 `subquery` 最左的表能被 JOIN 条件优化, `subquery`剩余表能被自身 LAST JOIN 的 JOIN 条件优化
- **Since OpenMLDB 0.8.4** LEFT JOIN. 要求 LEFT JOIN 的右表能被 LEFT JOIN 条件优化, LEFT JOIN 的左表能被上层的 LAST JOIN 条件优化

**Example: 支持上线的 `LAST JOIN` 语句范例**
创建两张表以供后续`LAST JOIN`
Expand Down Expand Up @@ -154,6 +146,27 @@ FROM t1 LAST JOIN (
ON t2.col1 = t3.col1
) tx
ON t1.col1 = tx.t2_col1

-- 右表是 LEFT JOIN
SELECT
t1.col1 as t1_col1,
tx.t2_col1,
tx.t3_col1
FROM t1 LAST JOIN (
SELECT t2.col1 as t2_col1, t3.col1 as t3_col1
FROM t2 LEFT JOIN t3
ON t2.col1 = t3.col1
) tx
ON t1.col1 = tx.t2_col1

-- 右表是窗口聚合计算
SELECT
t1.col1,
tx.agg
FROM t1 LAST JOIN (
SELECT col1, count(col2) over w as agg
FROM t2 WINDOW w AS (PARTITION BY col2 order by std_time ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
)
```


Expand Down
29 changes: 20 additions & 9 deletions docs/zh/openmldb_sql/dql/JOIN_CLAUSE.md
Original file line number Diff line number Diff line change
@@ -1,23 +1,31 @@
# JOIN Clause

OpenMLDB目前仅支持`LAST JOIN`一种**JoinType**
OpenMLDB目前支持

LAST JOIN可以看作一种特殊的LEFT JOIN。在满足JOIN条件的前提下,左表的每一行拼接符合条件的最后一行。LAST JOIN分为无排序拼接,和排序拼接。
- LAST JOIN
- LEFT JOIN (**OPENMLDB >= 0.8.4**)

LEFT OUTER JOIN (或者简称 LEFT JOIN) 会将两个 from_item 进行联接, 同时保留左侧from_item中的所有记录, 即使右侧from_item满足联接条件的记录数为零。对于右侧表中没有找到匹配的记录,则右侧的列会以 NULL 值填充。

LAST JOIN 是 OpenMLDB SQL 拓展的 JOIN类型. 它的语法和 LEFT JOIN 基本一致, 但在右侧 from_item 后面允许带可选的 ORDER BY 子句, 表示筛选右侧 from_iem 的顺序. 根据是否带有这个 ORDER BY 子句, LAST JOIN分为无排序拼接,和排序拼接。

- 无排序拼接是指:未对右表作排序,直接拼接。
- 排序拼接是指:先对右表排序,然后再拼接。

与LEFT JOIN相同,LAST JOIN也会返回左表中所有行,即使右表中没有匹配的行。
与LEFT JOIN相同,LAST JOIN也会返回左表中所有行,即使右表中没有匹配的行。不同的是, LAST JOIN 是一对一, LEFT JOIN 是一对多.

## Syntax

```
JoinClause
::= TableRef JoinType 'JOIN' TableRef [OrderByClause] 'ON' Expression
join:
TableRef "LAST" "JOIN" TableRef [OrderByClause] "ON" Expression
| TableRef join_type "JOIN" TableRef "ON" Expression
JoinType ::= 'LAST'
join_type:
'LEFT' [OUTER]
OrderByClause := 'ORDER' 'BY' <COLUMN_NAME>
order_by_clause:
'ORDER' 'BY' <COLUMN_NAME>
```

### 使用限制说明
Expand All @@ -30,14 +38,17 @@ OrderByClause := 'ORDER' 'BY' <COLUMN_NAME>
## SQL语句模版

```sql
SELECT ... FROM table_ref LAST JOIN table_ref ON expression;
SELECT ... FROM t1 LAST JOIN t2 ON expression;

SELECT ... FROM t1 LEFT JOIN t2 ON expression;
```

## 边界说明

| SELECT语句元素 | 离线模式 | 在线预览模式 | 在线请求模式 | 说明 |
| :--------------------------------------------- | --------- | ------------ | ------------ |:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| JOIN Clause| **````** | **``x``** | **````** | 表示数据来源多个表JOIN。OpenMLDB目前仅支持LAST JOIN。在线请求模式下,需要遵循[在线请求模式下LAST JOIN的使用规范](../deployment_manage/ONLINE_REQUEST_REQUIREMENTS.md#在线请求模式下-last-join-的使用规范) |
| LAST JOIN | **````** | **``x``** | **````** | 表示数据来源多个表JOIN。在线请求模式下,需要遵循[在线请求模式下LAST JOIN的使用规范](../deployment_manage/ONLINE_REQUEST_REQUIREMENTS.md#在线请求模式下-last-join-的使用规范) |
| LEFT JOIN | **``x``** | **``x``** | **````** | 由于 LEFT JOIN 是一对多 JOIN, 本身不能之间由于在线请求模式. 但是可以作为其他类型查询内部的子查询, 例如作为 LAST JOIN 的右表. 具体参考[在线请求模式下LAST JOIN的使用规范](../deployment_manage/ONLINE_REQUEST_REQUIREMENTS.md#在线请求模式下-last-join-的使用规范) |


### 未排序的LAST JOIN
Expand Down
32 changes: 21 additions & 11 deletions docs/zh/openmldb_sql/sql_difference.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
| -------------- | ---------------------------- | -------------------------------- | -------------------------------- | ------------ | ------------------------------------------------------------ |
| WHERE 子句 ||||| 部分功能可以通过带有 `_where` 后缀的内置函数实现 |
| HAVING 子句 ||| X || |
| JOIN 子句 ||||| OpenMLDB 仅支持特有的 **LAST JOIN** |
| JOIN 子句 ||||| OpenMLDB 支持特有的 **LAST JOIN**, 和 **LEFT JOIN** |
| GROUP BY 分组 ||||| |
| ORDER BY 关键字 ||||| 仅支持在 `WINDOW``LAST JOIN` 子句内部使用,不支持倒排序 `DESC` |
| LIMIT 限制行数 ||||| |
Expand Down Expand Up @@ -94,19 +94,23 @@ GROUP BY 语句,目前仍为实验性功能,仅支持输入表是一张物
| LAST JOIN ||||
| 子查询 ||||

### JOIN 子句(LAST JOIN)
### JOIN 子句

OpenMLDB 仅支持 LAST JOIN 一种 JOIN 语法,详细描述参考扩展语法的 LAST JOIN 部分。JOIN 有左右两个输入,在线请求模式下,支持两个输入为物理表,或者特定的子查询,详见表格,未列出情况不支持。
OpenMLDB 支持 LAST JOIN 和 LEFT JOIN,详细描述参考扩展语法的 JOIN 部分。JOIN 有左右两个输入,在线请求模式下,支持两个输入为物理表,或者特定的子查询,LEFT JOIN 不能直接用于在线请求模式, 但可以作为 LAST JOIN 的右表输入. 详见表格,未列出情况不支持。

| **应用于** | **离线模式** | **在线预览模式** | **在线请求模式** |
| ------------------------------------------------------------ | ------------ | ---------------- | ---------------- |
| 两个表引用 ||||
| 子查询, 仅包括:<br>左右表均为简单列筛选<br>左右表为 WINDOW 或 LAST JOIN 操作<br>带 WHERE 条件过滤的单表查询 ||||
| **应用于** | **离线模式** | **在线预览模式** | **在线请求模式** |
| ---------------------------------------------- | ------------ | ---------------- | ---------------- |
| LAST JOIN + 两个表引用 ||||
| LAST JOIN + 左右表均为简单列筛选 ||| ✓l |
| LAST JOIN + 右表是带 WHERE 条件过滤的单表查询 ||||
| LAST JOIN左表或右表为 WINDOW 或 LAST JOIN 操作 ||||
| LAST JOIN + 右表是LEFT JOIN 的子查询 ||||
| LEFT JOIN ||||

特殊限制:

- 关于特定子查询的 LAST JOIN 上线,还有额外要求,详见[上线要求](../openmldb_sql/deployment_manage/ONLINE_REQUEST_REQUIREMENTS.md#在线请求模式下-last-join-的使用规范)
- 在线预览模式下暂不支持 LAST JOIN
- 在线预览模式下暂不支持 LAST JOIN 和 LEFT JOIN

### WITH 子句

Expand Down Expand Up @@ -238,15 +242,15 @@ SELECT

在实际开发中,较多的应用的数据是存放在多个表格中,在这种情况下,一般会使用 WINDOW ... UNION 的语法进行跨表的聚合操作。请参考[跨表特征开发教程](../tutorial/tutorial_sql_2.md)关于“ 副表多行聚合特征”部分。

### LAST JOIN 子句
### JOIN 子句

关于 LAST JOIN 详细语法规范,请参考 [LAST JOIN 文档](../openmldb_sql/dql/JOIN_CLAUSE.md#join-clause)
关于 JOIN 详细语法规范,请参考 [JOIN 文档](../openmldb_sql/dql/JOIN_CLAUSE.md#join-clause)

| **语句元素** | **支持语法** | **说明** | **必需?** |
| ------------ | ------------ | ------------------------------------------------------------ | ---------- |
| ON || 列类型支持:BOOL, INT16, INT32, INT64, STRING, DATE, TIMESTAMP ||
| USING | 不支持 | - | - |
| ORDER BY || 后面只能接单列列类型 : INT16, INT32, INT64, TIMESTAMP<br>不支持倒序关键字 DESC | - |
| ORDER BY || LAST JOIN 的拓展语法, LEFT JON 不支持. <br />后面只能接单列列类型 : INT16, INT32, INT64, TIMESTAMP, 不支持倒序关键字 DESC | - |

#### LAST JOIN 举例

Expand All @@ -256,4 +260,10 @@ SELECT
FROM
t1
LAST JOIN t2 ON t1.col1 = t2.col1;

SELECT
*
FROM
t1
LEFT JOIN t2 ON t1.col1 = t2.col1;
```

0 comments on commit 0786574

Please sign in to comment.