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

Randomly Populating Foreign Key In Sample Data Set

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

数据库已经有一个 Schools table 有几千条记录。为了争论起见,我们假设它看起来像这样

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

我正在创建一个新的 Survey table。它只有大约 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 字段是给我带来最大麻烦的事情。我可以随机 select 1000 所学校,但我还没有找到生成 1000 个随机 SurveyId 的方法。我一直在努力避免 while 循环,但也许这是唯一的选择?

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

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

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

注意:这似乎不起作用。 Here 是 SQL Fiddle 表示不工作。我很惊讶它不起作用,因为 newid() 应该是

编辑:

如果您知道调查 ID 没有间隔且从 1 开始,您可以这样做:

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

我确实检查过它是否有效。

编辑二:

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

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 Fiddle 证明这一点。