2014-12-04 47 views
3

我是寫SQL的新手,似乎無法從我的遞歸語句中獲得正確的輸出。源表是這樣的:DB2中的SQL遞歸連接的問題

SEQUENCE TEXT  CATEGORY 
1   This is  apples 
2   a complete apples 
3   sentence. apples 

我試圖得到的輸出是:

CATEGORY TEXT 
apples  This is a complete sentence. 

但是,我得到的結果是:

CATEGORY TEXT 
apples  This is a complete 

我基本上無法連接兩行以上的行。我認爲這與我在WITH語句的遞歸部分中設置的計數有關。

WITH rquery (category, sequence, sentence) 
     AS (SELECT base.category, base.sequence, base.text 
      FROM myTable base 
      WHERE sequence = 1 
      Union ALL 
      SELECT t1.category, t1.sequence, sentence || ' ' || t1.text 
      FROM rquery t0, myTable t1 
      WHERE t0.category = t1.category And t0.sequence + 1 = t1.sequence 
      ) 
SELECT * FROM rquery WHERE sequence in (SELECT MAX(sequence) FROM rquery); 

如果您刪除最後一個WHERE子句,結果表明這是怎麼回事,但我似乎無法找到解決的辦法得到它的權利。這裏有沒有最後的WHERE子句:

CATEGORY SEQUENCE SENTENCE 
apples  1   This is 
apples  2   This is a complete 
apples  3   This is a complete 
+0

您正在從2個不同的表中進行選擇:'myTable base'和'hfcom.ordcom t1' - 您確定數據在兩個表中都一致嗎? – mustaccio 2014-12-04 18:29:52

+0

錯過了,我糾正了它,是的,這是同一張桌子。 – hattanthecat 2014-12-04 18:58:39

+0

這裏有幾件事情 - 不要使用隱式連接(以逗號分隔的FROM子句)語法。相反,請始終明確列出您的聯接,並儘可能多地將條件移至相關的「ON」子句。您可能還想嘗試將'rquery'連接到原始表上的聚合子查詢中,因爲優化器可能通過索引實現'MAX'更好的時間。 – 2014-12-05 04:07:04

回答

0

根據TEXT是如何定義的,最終的價值可能會被截斷,然後根據您使用運行查詢的客戶端上,你可能永遠不會知道。

嘗試將鑄件TEXT鑄造成較長的VARCHAR,例如,

WITH rquery (category, sequence, sentence) 
    AS (SELECT base.category, base.sequence, CAST(base.text AS VARCHAR(100)) 
     FROM myTable base 
     ... 

sentence所得數據類型必須足夠大,以適應的text S中的最長可能的級聯。

+0

哇,我忽略了它 - 它工作!謝謝你,先生。 – hattanthecat 2014-12-04 21:29:21

+0

如果這與任何人閱讀有關,它是通過Excel VBA中的ADODB連接的記錄集。 – hattanthecat 2014-12-04 21:30:39