【发布时间】:2012-05-23 03:02:31
【问题描述】:
我有两张桌子,custassets 和 tags。为了生成一些测试数据,我想做一个 INSERT INTO 一个多对多表和一个 SELECT 从每个表中获取随机行(以便一个表中的随机主键与随机主键配对从第二个)。令我惊讶的是,这并不像我最初想象的那么容易,所以我坚持要自学。
这是我的第一次尝试。我选择 10 custassets 和 3 tags,但在每种情况下都相同。我可以修复第一个表,但我想随机分配分配的标签。
SELECT
custassets_rand.id custassets_id,
tags_rand.id tags_rand_id
FROM
(
SELECT id FROM custassets WHERE defunct = false ORDER BY RANDOM() LIMIT 10
) AS custassets_rand
,
(
SELECT id FROM tags WHERE defunct = false ORDER BY RANDOM() LIMIT 3
) AS tags_rand
这会产生:
custassets_id | tags_rand_id
---------------+--------------
9849 | 3322 }
9849 | 4871 } this pattern of tag PKs is repeated
9849 | 5188 }
12145 | 3322
12145 | 4871
12145 | 5188
17837 | 3322
17837 | 4871
17837 | 5188
....
然后我尝试了以下方法:在SELECT 列列表中执行第二个RANDOM() 调用。然而这个更糟糕,因为它选择了一个标签 PK 并坚持下去。
SELECT
custassets_rand.id custassets_id,
(SELECT id FROM tags WHERE defunct = false ORDER BY RANDOM() LIMIT 1) tags_rand_id
FROM
(
SELECT id FROM custassets WHERE defunct = false ORDER BY RANDOM() LIMIT 30
) AS custassets_rand
结果:
custassets_id | tags_rand_id
---------------+--------------
16694 | 1537
14204 | 1537
23823 | 1537
34799 | 1537
36388 | 1537
....
这在脚本语言中很容易,而且我确信使用存储过程或临时表可以很容易地完成。但是我可以只使用INSERT INTO SELECT 吗?
我确实想过使用随机函数来选择整数主键,但不幸的是,两个表的主键在增量序列中都有间隙(因此可能会在每个表中选择一个空行)。不然就好了!
【问题讨论】:
-
感谢所有评论的人 - 如果由我决定,我会奖励几个滴答声!
:-)
标签: sql postgresql join random cartesian-product