如何解决生成至少出现一次的数据
我有三张桌子:
except: pass
表流派和电影充满了数据,我想为表movie_genres生成一些随机数据,以便每部电影至少有一个流派。 我以这种方式尝试过,但是电影可能没有任何类型。任何人都可以帮我吗?
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)
);
解决方法
嗯,您可以尝试加入一个派生表,在该表中您首先选择一种随机流派,然后再随机 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;
然而,这意味着每部电影都会首先选择一种类型。为了克服这个问题并使每部电影的第一个类型是随机的,可以使用横向连接。 (备注:您需要在派生表中使用外部表中的某些列,否则优化器似乎会将 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;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。