2014-12-04 52 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