2011-11-25 56 views
1

我想从一个巨大的表中获得所有记录,其中number列中的任何一列的计数值都大于0。什么是最好的方式来做到这一点?对具有特定列值的记录的Oracle SQL“元”查询

例如为:

/* table structure*/ 
create table sometable (id number, 
         somestring varchar2(12), 
         some_amount_1 number(17,3), 
         some_amount_2 number(17,3), 
         some_amount_3 number(17,3), 
         ... 
         some_amount_xxx number(17,3)); 
/* "xxx" > 100, and yeah I did not designed that table structure... */ 

而且我想任何行,其中任何some_amount_n > 0的(甚至更好的解决方案是在显示的字段(一个或多个第一位置添加一个字段)大于零)。

我知道我可以用一个巨大的some_amount_1 > 0 OR some_amount_2 > 0 OR ...块(与一些case when字段名写这个,但应该有一些更优雅的解决方案,是不是有

+2

优雅的解决方案是通过有一个数字列规范化您的表。 Instaed of> 100'some_amount_X'列,创建一个只有4列的表:'(id,somestring,X,some_amount)' –

+0

也许你是对的@ypercube,但我不能这样做:没有权限那并不能强迫那些拥有。 –

+3

如果数字是非负数,则在'select'的'where'子句中添加所有数字并检查总和是否大于' – Raihan

回答

3

可能的解决方案:

  1. 正常化表格,你说你不允许,试着说服那些通过解释好处(性能,写查询的难易程度等)来禁止这种变化的人

  2. 编写巨大的丑陋OR查询。您还可以将它与标准化表的查询版本一起打印。加入性能测试(你被允许创建另一个测试表或数据库,我希望。)

  3. 编写一个程序,产生了可怕的OR查询(无论是在PL/SQL或其他程序语言)。 (同样,配以优雅的版本一起打印)

  4. 添加一个新列,说叫Any_x_bigger_than_zero其通过触发自动填充以01(即使用一个巨大的丑陋OR)。那么你只需要检查:WHERE Test_x_bigger_than_zero = 1,看看是否有任何行是> 0

  5. 与以前相似,但更好的是,用这样的列创建物化视图。

1

首先,创建一个表,将数据排序为更容易读取的内容...像id,column_name,column_value这样简单的东西。你将不得不忍受我,因为我已经在oracle操作了一段时间,所以这是很重的伪代码充其量:

快速动态SQL数据库...你可以设置一个变量到一个sql语句和然后执行该变量。存在一些安全风险,并且可能在您的环境中禁用此功能...因此请确认您可以先运行此功能。声明一个变量,将该变量设置为'select 1',然后使用'execute immediate'来执行存储在变量中的sql。

set var = 'select id, ''some_amount_' || 1 || '', some_amount || 1 || ' from table where some_amount_' || 1 || ' <> 0' 

假设我有我的Oracle语法正确的...(管追加吧?我相信3单引号“”“应该产生一个”当一个变量太多,你可能要试错这行,直到你有VAR设置为):

select id, 'some_amount_1',some_amount_1 
from table 
where some_amount_1 <> 0 

这应该选择ID和数据库中的每个ID在some_amount_1值。你可以很容易地把它变成一个插入语句。

我假设some_amount_xxx有一个上限...下一个技巧是循环这个巨大的声明。再次,可怕的伪代码:

declare sql_string 
declare i and set to 1 
for i = 1 to xxx (whatever your xxx is) 
set sql_string to the first set var statement we made, replacing the '1' with the i var here. 
execute sql 
increment i 
loop 

希望这是有道理的...这是你真的愿意环路动态sql的极少数场景之一。现在你有一个相对直接的表来阅读,这应该是一个相对简单的查询从这里

相关问题