2011-11-25 94 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的極少數場景之一。現在你有一個相對直接的表來閱讀,這應該是一個相對簡單的查詢從這裏

相關問題