在样本数据集中随机填充外键

时间:2015-03-14 17:36:45

标签: sql sql-server test-data sample-data data-generation

我正在为新数据库生成测试数据,而我在填充其中一个外键字段时遇到了问题。我需要在表(SurveyResponses)中创建一个相对较大数量(1000)的条目,该表具有仅包含6个条目的表的外键(Surveys

数据库已经有一个Schools表,有几千条记录。为了论证,可以说它看起来像这个

Schools
+----+-------------+
| Id | School Name |
+----+-------------+
|  1 | PS 1        |
|  2 | PS 2        |
|  3 | PS 3        |
|  4 | PS 4        |
|  5 | PS 5        |
+----+-------------+

我正在创建一个新的Survey表。它只有大约3行。

Survey
+----+-------------+
| Id |    Col2     |
+----+-------------+
|  1 | 2014 Survey |
|  2 | 2015 Survey |
|  3 | 2016 Survey |
+----+-------------+

SurveyResponses只是将学校与调查结合起来。

Survey Responses
+----+----------+----------+
| Id | SchoolId | SurveyId |
+----+----------+----------+
|  1 |        1 |        1 |
|  2 |        2 |        2 |
|  3 |        3 |        1 |
|  4 |        4 |        3 |
|  5 |        5 |        2 |
+----+----------+----------+

填充SurveyId字段是给我带来最大麻烦的。我可以随机选择1000所学校,但我还没有找到一种生成1000个随机SurveyIds的方法。我一直试图避免一个while循环,但也许这是唯一的选择?

我一直在使用Red Gate SQL数据生成器来生成一些测试数据,但在这种情况下,我真的很想了解如何使用原始SQL来完成这项工作。

1 个答案:

答案 0 :(得分:0)

这是一种方法,使用相关子查询来获得与每所学校相关的随机调查:

select s.schoolid,
       (select top 1 surveyid
        from surveys
        order by newid()
       ) as surveyid
from schools s;

注意:这似乎不起作用。 Here是一个显示非工作性的SQL小提琴。我很惊讶它不起作用,因为newid()应该是

编辑:

如果您知道调查ID没有间隙并以1开头,则可以执行以下操作:

select 1 + abs(checksum(newid()) % 3) as surveyid

我确实检查过这确实有用。

编辑II:

这似乎是过于激进的优化(在我看来)。关联查询似乎可以解决问题。所以,这样的事情应该有效:

select s.schoolid,
       (select top 1 surveyid
        from surveys s2
        where s2.surveyid = s.schoolid or s2.surveyid <> s.schoolid -- nonsensical condition to prevent over optimization
        order by newid()
       ) as surveyid
from schools s;

Here是一个证明这一点的SQL小提琴。