扁平化/反规范化 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 列,然后执行 < code>If Exists ( SELECT * FROM PatientRisksOnCheckup where RiskID=i and checkupID=j ) INSERT INTO PatientCheckup (1) WHERE CheckupID=j 并迭代i, j...
> > _<
只为一个表编写此查询是可行的,但不是最好的,但我需要为另外 30 个相同大小的表展平这样的数据。呃...请提出建议?
我也很好奇我正在做的事情是否是一件常见的事情......?
我需要对统计软件的 sql 数据进行非规范化/扁平化。
I have a bunch of tables like this:
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
...
But I need a flattened version, like this:
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
I'm clueless how to do this, the best I can think of is to write a temp table, define all 122 columns, and then do If Exists ( SELECT * FROM PatientRisksOnCheckup where RiskID=i and checkupID=j ) INSERT INTO PatientCheckup (1) WHERE CheckupID=j
and iterate overi, j...
>_<
Writing this query for just one table is doable not the best, but I've need to flatten data like this for another thirty tables of the same size. Er... suggestions please?
I am also curious to know if what I am doing is a common thing to do or not... ?
I am needing to denormalize/flatten the sql data for statistics software.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您需要的是所谓的交叉表查询。
如果您使用的是 Microsoft SQL Server,则可以使用
PIVOT< /code>
运算符来执行此操作。
其他品牌的 RDBMS 对此类查询的支持各不相同。最坏的情况是您必须使用动态 SQL 将查找表中的非常值硬编码到主表的联接中。当您有 122 个不同的值时,这是不切实际的。
另请参阅标记为 pivot 或 交叉表。
What you need is called a crosstab query.
If you're using Microsoft SQL Server, you can use the
PIVOT
operator to do it.Other brands of RDBMS have varying support for this type of query. Worst case is you'll have to use dynamic SQL to hard-code very value from the lookup table into a join to your main table. This is not practical when you have 122 distinct values.
Also see SO questions tagged pivot or crosstab.
使用数据透视表此处 - Microsoft 和 此处 - 教程。
但是,您需要指定所有列。但您可以使用 sp_executesql 命令来使用动态 SQL。
Use PIVOT TABLE Here - Microsoft and here - tutorial.
You will need hovewer to specify all the columns. But you can use sp_executesql command to use dynamic SQL.
如何在 INSERT AND UPDATE、DELETE 上使用触发器,以便这些非规范化表被填满......
How about using triggers on INSERT AND UPDATE, DELETE, so that these Denormalized table gets filled up...