我正在为新数据库生成测试数据,而我在填充其中一个外键字段时遇到了问题。我需要在表(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来完成这项工作。
答案 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小提琴。