2008-11-04 70 views
3

我正在使用Informix(版本7.32)數據庫。在一個操作中,我使用常規表和串行列的ID創建一個臨時表(因此我會將常規表中的所有ID連續編號)。但我想插入由ID類似下令常規表的信息:插入臨時值(select ....按ID排序)

CREATE TEMP TABLE tempTable (id serial, folio int); 

INSERT INTO tempTable(id,folio) 
SELECT 0,folio FROM regularTable ORDER BY folio; 

但是這創造了一個語法錯誤

(因爲ORDER BY的)有沒有什麼辦法可以訂購信息然後將其插入tempTable?

更新:我想這樣做的原因是因爲常規表有大約10,000個項目,並且在一個jsp文件中,它必須顯示每條記錄,但它需要很長時間,所以我想要做的真正原因這是分頁的輸出。此版本的Informix沒有LimitSkip。我不能對系列重新編號,因爲它們存在關係,這是我們在一個頁面上獲得固定數量結果的唯一解決方案(例如每頁500個結果)。在Regular表中跳過了id(稱爲folio),因爲它們已被刪除。如果我是把

SELECT * FROM regularTable WHERE folio BETWEEN X AND Y 

我會得到,也許300頁,然後在500下一頁

+0

目前其實沒有任何的Informix數據庫管理系統的7.4版本(肯定不是主流的 - 奇數球像紅磚,它的Informix收購在IBM收購Informix之前不久,可能會有這樣一個版本號)。 – 2008-11-20 05:04:18

回答

0

你可以試試迭代光標在SELECT ... ORDER BY,做的INSERT在循環內。

+0

這樣做的缺點是它涉及到從服務器到應用程序的往返行程以獲取並插入每一行。儘管如此,這是行之有效的方式。 – 2008-11-20 05:02:21

0

它已經多年,因爲我曾在Informix上,但也許這樣的事情會工作:

INSERT INTO tempTable(id,folio) 
SELECT 0, folio 
FROM (
    SELECT folio FROM regularTable ORDER BY folio 
); 
2

在Informix中使用SELECT在INSERT語句中的子條款時,你是有限 到SELECT語法的一個子集

下面的SELECT子句中不支持在這種情況下:

  • INTO TEMP
  • ORDER BY
  • UNION。

此外,SELECT的FROM子句不能引用INSERT引用的同一個表(不是你的情況)。

0

在插入表格時排序行是沒有意義的。關係數據庫不允許您指定表中行的順序。

即使可以,SQL也不保證查詢將以任何順序返回行,例如您插入它們的順序。您必須指定ORDER BY子句以保證查詢結果的順序。

所以它會對你改變插入行的順序沒有好處。

0

正如比爾所說,沒有很多點排序輸入,你真的需要命令輸出。在你提供的簡單例子中,它沒有任何意義,所以我只能假設你試圖解決的真正問題更復雜 - 也許是重複數據刪除?

您所追求的功能是CREATE SEQUENCE,但我非常確定它在這種舊版本的Informix中不可用。

如果您確實需要按照要求進行操作,您可以按照所需順序查看數據,然後再查看LOAD。這將確保SERIAL值順序分配。

0

會這樣的工作?

SELECT 
    folio 
FROM 
    (
     SELECT 
      ROWNUM n, 
      folio 
     FROM 
      regularTable 
     ORDER BY 
      folio 
    ) 
WHERE 
    n BETWEEN 501 AND 1000 

如果表變大,或者你後來取「頁」,但10K行是非常小的它可能不是非常有效。

我不記得Informix是否有ROWNUM概念,我使用Oracle。

+0

有rowid ...也許是一樣的 – seFausto 2008-11-06 01:06:01

3

您可以通過打破了SQL做到這一點爲兩個臨時表:

CREATE TEMP TABLE tempTable1 (
id serial, 
folio int); 

SELECT folio FROM regularTable ORDER BY folio 
INTO TEMP tempTable2; 

INSERT INTO tempTable1(id,folio) SELECT 0,folio FROM tempTable2;