Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions TOC.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
1 change: 1 addition & 0 deletions keywords.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
66 changes: 66 additions & 0 deletions lateral-derived-tables.md
Original file line number Diff line number Diff line change
@@ -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)
2 changes: 1 addition & 1 deletion mysql-compatibility.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading