生成至少出现一次的数据

Generate data with at least one occurence

我有三个table:

create table genres
(
genre_id serial primary key,
genre_name varchar NOT NULL UNIQUE
);

create table movies
(
movie_id serial primary key,
movie_name varchar NOT NULL           
);

create table movie_genres
(
movie_id integer references movies NOT NULL,
genre_id integer references genres NOT NULL, 
PRIMARY KEY(movie_id, genre_id)
);

流派和电影表中充满了数据,我想为 table movie_genres 生成一些随机数据,以便每部电影至少有一种流派。 我这样试过,但是一部电影可能没有任何类型。有人可以帮我吗?

insert into movie_genres 
select movie_id, genre_id 
from genres cross join movies 
where random() < 0.15;

嗯,您可以尝试加入派生的 table,其中您首先 select 一种随机类型,然后 UNION 一些更随机的类型。

INSERT INTO movie_genres 
        (movie_id,
         genre_id)
SELECT m.movie_id,
       rg.genre_id
       FROM movies m
            CROSS JOIN ((SELECT g.genre_id
                                FROM genres g
                                ORDER BY random()
                                LIMIT 1)
                        UNION
                        (SELECT g.genre_id
                                FROM genres g
                                WHERE random() < 0.15)) rg;

然而,这意味着每部电影都有一种类型 select 首先。为了克服这个问题并使每部电影的第一个类型随机,可以使用横向连接。 (备注:您需要在派生 table 中使用来自外部 table 的某些列,否则优化器似乎会优化 LATERAL。)

INSERT INTO movie_genres 
            (movie_id,
             genre_id)
SELECT rg.movie_id,
       rg.genre_id
       FROM movies m
            CROSS JOIN LATERAL ((SELECT g.genre_id,
                                        m.movie_id -- that's just here to force the optimizer to keep the join lateral
                                        FROM genres g
                                        ORDER BY random()
                                        LIMIT 1)
                                UNION
                                (SELECT g.genre_id,
                                        m.movie_id
                                        FROM genres g
                                        WHERE random() < 0.15)) rg;

db<>fiddle