2009-09-22 71 views
9

我有一个这样的一堆表:最好的方法来平整/非规范化SQL查找表?

Lookup_HealthCheckupRisks 
------------ 
ID Name 
1 Anemia 
2 Anorexic 
3 Bulemic 
4 Depression 
... 
122 Syphilis 



PatientRisksOnCheckup 
------------------ 
ID CheckupID RiskID 
1 11  2 
2 11  3 
3 12  1 
4 14  1 
5 14  3 
... 

但我需要一个扁平的版本,像这样:

PatientCheckup 
------------------ 
CheckupID Risk_1 Risk_2 Risk_3 Risk_4 .. Risk_122 
11  0  1  1  0   0 
12  1  0  0  0   0 
13  0  0  0  0   0 
14  1  0  1  0   0 

我无能如何做到这一点,最好的我能想到的是写一个临时表,定义所有122列,然后做If Exists (SELECT * FROM PatientRisksOnCheckup where RiskID=i and checkupID=j) INSERT INTO PatientCheckup (1) WHERE CheckupID=j和迭代i, j...> _ <

写此查询只是一个表是可行的不是最好的,但我需要扁平化数据LI再用30张相同大小的桌子。呃...建议吗?

我也很好奇,想知道我正在做的事情是否是常见的事情?

我需要非规格化/扁平化统计软件的sql数据。

+0

请描述您正在使用的数据库。 – RedFilter 2009-09-22 17:40:03

+0

+1感谢您在Stackoverflow上成为理智的人 – 2010-01-26 16:59:05

回答

10

您需要的是称为交叉表查询。

如果您使用Microsoft SQL Server,则可以使用PIVOT运算符来完成此操作。

其他品牌的RDBMS对这种类型的查询有不同的支持。最糟糕的情况是,您将不得不使用动态SQL将查询表中非常有价值的代码硬编码到主表中。当你有122个不同的值时,这是不实际的。

另见SO问题标签pivotcrosstab

-1

如何在INSERT和UPDATE,DELETE上使用触发器,以便这些非规范化表被填满...