2009-09-22 75 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上使用觸發器,以便這些非規範化表被填滿...