0

我正在为新数据库生成测试数据,但在填充其中一个外键字段时遇到问题。我需要在一个表 () 中创建相对大量 (1000) 的条目,该表SurveyResponses具有指向只有 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 个随机调查 ID 的方法。我一直在努力避免while循环,但也许这是唯一的选择?

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

4

1 回答 1

0

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

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

注意:这似乎不起作用。 是一个显示非工作性的 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;

是一个演示这一点的 SQL Fiddle。

于 2015-03-14T17:55:40.733 回答