【发布时间】:2012-11-25 11:06:21
【问题描述】:
我有一个包含 N 列的表格。我们称它们为c1、c2、c3、c4、...cN。在多行中,我想为 [1, N] 中的每个 X 获取带有 COUNT DISTINCT(cX) 的单行。
c1 | c2 | ... | cn
0 | 4 | ... | 1
有没有一种方法可以在不手动将每个列名写入查询的情况下执行此操作(在存储过程中)?
为什么?
我们遇到了一个问题,即应用程序服务器中的错误意味着我们会用稍后插入的垃圾来重写好的列值。为了解决这个问题,我存储了信息日志结构,其中每一行代表一个逻辑UPDATE 查询。然后,当给出记录完成的信号时,我可以确定是否有任何值被(错误地)覆盖。
多行中单个正确记录的示例:每列最多有一个值。
| id | initialize_time | start_time | end_time |
| 1 | 12:00am | NULL | NULL |
| 1 | 12:00am | 1:00pm | NULL |
| 1 | 12:00am | NULL | 2:00pm |
Reconciled row:
| 1 | 12:00am | 1:00pm | 2:00pm |
我要检测的不可调和记录示例:
| id | initialize_time | start_time | end_time |
| 1 | 12:00am | NULL | NULL |
| 1 | 12:00am | 1:00pm | NULL |
| 1 | 9:00am | 1:00pm | 2:00pm | -- New initialize time => irreconcilable!
【问题讨论】:
-
你是问如何获取列名,或者如何进行聚合?
-
我知道如何获取列名,但我不知道如何在查询中的每个列名周围展开表达式。我想在我的存储过程中避免使用
SELECT COUNT DISTINCT(c1), COUNT DISTINCT(c2), ..., COUNT DISTINCT(cN) FROM ...。 -
当然,您可以使用动态 SQL 来执行此操作。顺便问一下,X 有多大?
-
列 N 的总数约为 30。
-
就我个人而言,我只需要添加一个审计触发器来记录对表的更改,修复应用程序服务器中的错误,而不必担心这种过于复杂的解决方法。见wiki.postgresql.org/wiki/Audit_trigger_91plus
标签: sql database postgresql relational-database