如何在mysql v8中模拟一个横向连接来执行每一行的子查询或连接?

yx2lnoni  于 2021-06-23  发布在  Mysql
关注(0)|答案(2)|浏览(357)

我有两张table:

film  with primary key film_id
actor with primary key actor_id

我现在要填一张table 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;

在这里可以找到postgresql小提琴:https://dbfiddle.uk/?rdbms=postgres_10&fiddle=6dc21a3ce3404aaf3f4453e2ee4f863b. 正如你所见,每部电影都有不同的演员。
我找不到支持你的人 LATERAL JOIN 在mysql v8中。如何在mysql v8中实现这种构造?
不工作的mysql小提琴可以在这里找到:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=6c1fb7df00cf8c73cbcca77752c9ef0d 正如你所见,每部电影都有相同的演员。

falq053o

falq053o1#

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-sy系统ntaxhttps://dev.mysql.com/doc/refman/8.0/en/lateral-derived-tables.html
派生表通常不能引用(依赖)同一from子句中前面表的列。从mysql 8.0.14开始,派生表可以定义为横向派生表,以指定允许这样的引用。

rwqw0loc

rwqw0loc2#

这是一种效率很低的方法:

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;

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

相关问题