如何在 MySQL v8 中模拟 LATERAL JOIN 来为每一行执行子查询或连接?

Jel*_*rns 4 mysql sql mysql-8.0

我有两个表:

film  with primary key film_id
actor with primary key actor_id
Run Code Online (Sandbox Code Playgroud)

我现在想填一张表film_actor(film_id, actor_id),将每部电影连接到 250 个随机演员。所以每部电影应该有250个不同的演员。

在 PostgreSQL 中,我会这样做:

insert into film_actor(film_id, actor_id)
select film_id, actor_id
from   film
cross join lateral
(
    select actor_id
    from   actor
    where  film_id is not null -- to force lateral behavior
    order  by random()
    limit  250
) as actor;
Run Code Online (Sandbox Code Playgroud)

可以在此处找到 PostgreSQL 小提琴:https : //dbfiddle.uk/?rdbms= postgres_10&fiddle =6dc21a3ce3404aaf3f4453e2ee4f863b。如您所见,每部电影都有不同的演员。

LATERAL JOIN在 MySQL v8 中找不到对s 的支持。你怎么能在 MySQL v8 中做这样的构造?

一个不工作的 MySQL 小提琴可以在这里找到:https : //dbfiddle.uk/? rdbms=mysql_8.0&fiddle =6c1fb7df00cf8c73cbcca77752c9ef0d如您所见,每部电影都有相同的演员。

Ada*_*icz 6

LATERAL 在 8.0.14 版中添加到 MySQL。

https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-14.html#mysqld-8-0-14-sql-syntax https://dev.mysql.com /doc/refman/8.0/en/lateral-derived-tables.html

派生表通常不能在同一 FROM 子句中引用(依赖)前面表的列。从 MySQL 8.0.14 开始,派生表可以定义为横向派生表,以指定允许此类引用。


Gor*_*off 3

这是一个相当低效的方法:

insert into film_actor (film_id, actor_id)
    select film_id, actor_id
    from (select f.film_id, a.actor_id,
                 row_number() over (partition by film_id order by rand()) as seeqnum
          from film f cross join
               actor a
         ) fa
    where seqnum <= 250;
Run Code Online (Sandbox Code Playgroud)

还有一种使用递归CTE的方法,但我认为性能会更差。