生成至少出现一次的数据
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;
我有三个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;