diff --git a/TOC.md b/TOC.md index c772134267106..bc6c301a6fb24 100644 --- a/TOC.md +++ b/TOC.md @@ -272,6 +272,7 @@ - [Subquery Related Optimizations](/subquery-optimization.md) - [Column Pruning](/column-pruning.md) - [Decorrelation of Correlated Subquery](/correlated-subquery-optimization.md) + - [LATERAL Derived Tables](/lateral-derived-tables.md) - [Eliminate Max/Min](/max-min-eliminate.md) - [Predicates Push Down](/predicate-push-down.md) - [Partition Pruning](/partition-pruning.md) diff --git a/keywords.md b/keywords.md index 5b080f17fb632..73a1feec7cd05 100644 --- a/keywords.md +++ b/keywords.md @@ -395,6 +395,7 @@ The following list shows the keywords in TiDB. Reserved keywords are marked with - LASTVAL - LEAD (R-Window) - LEADING (R) +- LATERAL (R) - LEAVE (R) - LEFT (R) - LESS diff --git a/lateral-derived-tables.md b/lateral-derived-tables.md new file mode 100644 index 0000000000000..0f85c8f12b02f --- /dev/null +++ b/lateral-derived-tables.md @@ -0,0 +1,66 @@ +--- +title: LATERAL Derived Tables +summary: Learn the syntax and current limitations of LATERAL derived tables in TiDB. +--- + +# LATERAL Derived Tables + +A **lateral derived table** is a subquery in the `FROM` clause that can reference columns from tables that appear earlier in the same `FROM` clause. This makes it more powerful than a standard derived table, whose subquery cannot reference outer columns in the same `FROM` clause. + +TiDB recognizes the `LATERAL` syntax for derived tables, following the MySQL 8.0 syntax ([WL#8652](https://dev.mysql.com/worklog/task/?id=8652)). + +> **Note:** +> +> Currently, TiDB supports parsing the `LATERAL` derived table syntax, but its execution is not yet supported and will return an error. You can track the progress for full execution support in issue [#40328](https://github.com/pingcap/tidb/issues/40328). + +## Syntax + +```sql +SELECT ... FROM table_ref, LATERAL (subquery) [AS] alias [(col_list)] ... +SELECT ... FROM table_ref [LEFT] JOIN LATERAL (subquery) [AS] alias [(col_list)] ON ... +``` + +- The `LATERAL` keyword must precede the derived table subquery. +- A table alias is required after the closing parenthesis of the subquery. +- The `AS` keyword before the alias is optional. +- An optional derived column list can follow the alias: `LATERAL (...) AS dt(col1, col2)`. + +## Examples + +### Comma join + +```sql +SELECT * FROM t1, LATERAL (SELECT * FROM t2 WHERE t2.id = t1.id) AS dt; +``` + +In this example, the subquery references `t1.id`, a column from the preceding table `t1`. A regular derived table (without `LATERAL`) cannot do this. + +### LEFT JOIN with a derived column list + +```sql +SELECT t1.id, dt.val +FROM t1 +LEFT JOIN LATERAL (SELECT t2.val FROM t2 WHERE t2.id = t1.id LIMIT 1) AS dt(val) +ON TRUE; +``` + +The derived column list `(val)` renames the columns that the subquery returns. + +## Comparison with standard derived tables + +| Feature | Standard derived table | LATERAL derived table | +|---|---|---| +| Can reference outer `FROM` columns | No | Yes | +| Alias required | Yes | Yes | +| Derived column list | Supported | Supported | + +## MySQL compatibility + +TiDB's LATERAL derived table syntax is compatible with MySQL 8.0 at the syntax level. + +## See also + +- [Subquery Related Optimizations](/subquery-optimization.md) +- [Decorrelation of Correlated Subquery](/correlated-subquery-optimization.md) +- [Explain Statements That Use Subqueries](/explain-subqueries.md) +- [MySQL Compatibility](/mysql-compatibility.md) diff --git a/mysql-compatibility.md b/mysql-compatibility.md index deb85071aa1bb..536eaa226b241 100644 --- a/mysql-compatibility.md +++ b/mysql-compatibility.md @@ -68,7 +68,7 @@ You can try out TiDB features on [TiDB Playground](https://play.tidbcloud.com/?u + "Session Tracker: Add GTIDs context to the OK packet" + Descending Index [#2519](https://github.com/pingcap/tidb/issues/2519) + `SKIP LOCKED` syntax [#18207](https://github.com/pingcap/tidb/issues/18207) -+ Lateral derived tables [#40328](https://github.com/pingcap/tidb/issues/40328) ++ Lateral derived tables (syntax is recognized but execution is not yet supported) [#40328](https://github.com/pingcap/tidb/issues/40328). For syntax details, see [LATERAL Derived Tables](/lateral-derived-tables.md). + JOIN ON subquery [#11414](https://github.com/pingcap/tidb/issues/11414) ## Differences from MySQL