2013-08-19 36 views
0

想知道是否有人可以在這裏幫助我處理一些SQL。我的任務是從遺留數據庫系統中檢索一些數據 - 它是運行v7.23C1的IBM Informix DB。這很可能是因爲我想在這裏做的事很簡單,但對於我的生活我無法弄清楚。IBM Informix SQL語法幫助

我已經習慣了MS SQL服務器,而不是任何其他數據庫系統,而這一次似乎很老:(?)http://publib.boulder.ibm.com/epubs/pdf/3731.pdf

基本上,我只是想運行一個查詢,包括嵌套,但我可以似乎無法弄清楚如何做到這一點。因此,舉例來說,我有一個查詢,看起來像這樣:

SELECT cmprod.cmp_product, 
(stock.stk_stkqty - stock.stk_allstk) stk_bal, 
    stock.stk_ospurch, 
    stock.stk_backord, 
    'Current Sales Period', 
    'Current Period -1', 
    'Current Period -2', 
    cmprod.cmp_curcost, 
    stock.stk_credate, 
    stock.stk_lastpurch, 
    stock.stk_binref 
FROM informix.stock stock, 
    informix.cmprod cmprod 
WHERE stock.stk_product = cmprod.cmp_product 
    AND (cmp_category = 'VOLV' 
    OR cmp_category = 'VOLD' 
    OR cmp_category = 'VOLA') 
    AND stk_loc = 'ENG'; 

現在,基本上在那裏我有這樣價值觀「本期-1」我想包括嵌套場將運行一個查詢,以獲得銷售在給定的日期範圍內。我確信我可以將它們分開放置,但當完全執行時似乎無法讓編譯器對我的代碼感到滿意。

大概就像(NB,這種特定的查詢是另列,但你的想法):

SELECT s.stmov_product, s.stmov_trandate, s.stmov_qty 
FROM informix.stmove s 
WHERE s.stmov_product = '1066823' 
AND s.stmov_qty > 0 
AND s.stmov_trandate IN (
    SELECT MAX(r.stmov_trandate) 
    FROM informix.stmove r 
    WHERE r.stmov_product = '1066823' 
    AND r.stmov_qty > 0) 

是什麼讓事情變得更糟糕的是,我沒有對服務器的訪問,這數據庫正在運行。目前,我有一個通過ODBC驅動程序連接的自定義C#應用程序,並執行原始SQL,將結果解析回.CSV。

任何和所有幫助讚賞!

回答

2

在任何情況下,Informix 7.23都非常老舊,以至於它仍然處於運行狀態。目前尚不清楚這是OnLine(Informix Dynamic Server,IDS)還是SE(標準引擎)數據庫。然而,7.23是Y2K認證的7.24版之前的版本,所以它已經有15年的歷史了,可能會稍微老一點。

在7.23的日子裏,Informix服務器支持的語法不如當前版本全面。因此,你需要小心。你應該有服務器的手冊 - 有人,你公司的某個地方應該。如果不是,則需要嘗試在IBM Informix網頁的墳墓手冊部分找到它(爲了簡化URL,請從http://www.informix.com/開始;但是,陳舊的手冊需要一些發現,但您應該可以從http://pic.dhe.ibm.com/infocenter/ifxhelp/v0/index.jsp 'LHS服務器')。

如果你試圖寫:

SELECT ... 
     (SELECT ...) AS 'Current - 1', 
     (SELECT ...) AS 'Current - 2', 
     ... 
    FROM ... 

,那麼你需要學習服務器SQL語法7.23知道它是否是允許的。 AFAICR,OnLine(Informix Dynamic Server)將允許它和SE可能不會,但是這遠遠沒有確定性。我簡直不記得那個古老的版本有什麼限制。


從7.2 Informix Guide to SQL: Syntax手動來看(日期爲1996年4月 - 17歲),你不能把一個(SELECT ...)在選擇列表在這個版本的Informix。

您可能必須創建一個包含所需結果的臨時表(以及相應的鍵信息),然後從主查詢中的臨時表中進行選擇。

這類事情是沒有更新您的服務器這麼長時間的問題之一。

+0

是的,這是我最終想要做的。我同意它需要替換,但那不是我能做的。我可能最好將我需要的所有數據去除到內存中並自己處理,而不是在Informix SQL中對其進行巧妙處理。 – absentmindeduk

+0

非常好,謝謝喬納森 - 你正在向合唱團傳遞升級信息! ;) – absentmindeduk

0

對不起,你可以通過縮短語法來減少我們的憐憫嗎?.. table.columns可以表示別名。同時,如果您不能升級到更新版本的Informix,則必須依賴一個或多個SELECT INTO臨時表查詢才能實現您的目標,順便說一句,這將使您的代碼在不同版本之間更易於移植。您還必須評估使用TEMP表是否意味着不可接受的處理時間。