Skip to content
Open
1 change: 1 addition & 0 deletions TOC.md
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,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
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 how to use LATERAL derived tables in TiDB.
Comment thread
terry1purcell marked this conversation as resolved.
Outdated
---

# 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 MySQL 8.0 compatibility ([WL#8652](https://dev.mysql.com/worklog/task/?id=8652)).
Comment thread
terry1purcell marked this conversation as resolved.
Outdated

> **Note:**
>
> Currently, TiDB supports parsing LATERAL derived table syntax, but execution is not yet supported and will return an error. Full execution support is tracked in [#40328](https://github.com/pingcap/tidb/issues/40328).
Comment thread
terry1purcell marked this conversation as resolved.
Outdated

## 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 produced by the subquery.
Comment thread
terry1purcell marked this conversation as resolved.
Outdated

## 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. Once full execution support is available, queries that use `LATERAL` in MySQL should also work in TiDB.
Comment thread
terry1purcell marked this conversation as resolved.
Outdated

## 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 @@ -71,7 +71,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).

## Differences from MySQL

Expand Down
Loading