嵌套子查询中找不到列或全局变量

时间:2013-04-03 14:48:26

标签: sql db2 ibm-midrange

我有一个带有两个表的db2数据库;我们称他们为orderorder_comment

我想要的是检索最新评论的日期以及订单信息。

例如,在sql server 2005上,我可以编写如下的查询:

select a.*, (select comment_datetime FROM
    (select comment_datetime, RANK() OVER (PARTITION BY order_id ORDER BY comment_datetime DESC) AS [rank]
        FROM order_comment c where c.order_id = a.id
    ) b where b.[rank] = 1) as 'Last Comment'
from order a

这将返回以下数据:

| id | description |       Last Comment      |
|  1 |  fake order | 2013-04-03 10:05:04.797 |

但是,当我尝试对我的db2数据库运行以下查询(我认为是等效的)时,我收到此错误:Column or global variable id1 not found.

select b.id1, b.id2, b.status, 
    (select a.code from 
        (select code, RANK() over (order by date desc, time desc) as recent from
            history where h_id1 = b.id1 and h_id2 = b.id2 
                 and code in ('A', 'B', 'C')) a where a.recent = 1)
     as 'recent code'
from item b

经过一番游戏,我发现在我的第一个子查询中使用id1并没有产生相同的错误;在深度超过一个级别的子查询中使用全局值时,我只遇到了一个问题。

这是预期的行为吗?这让我很奇怪;我认为任何数量的子查询应该能够访问属于任何父级的任何值(在sql server 2005上似乎是这种情况,我假设大多数其他RDBMS)。

如果这实际上是预期的行为,还有其他方法可以完成这项任务吗?

2 个答案:

答案 0 :(得分:2)

我相信DB2,你必须“冒泡”(或向下)你想要在子查询中使用的任何列(IE,它必须在直接父或子查询中才能访问列)。

作为替代方案,我认为您可以通过此查询获得所需内容:

SELECT 
     b.id1
    ,b.id2
    ,b.status
    ,(SELECT h.code
      FROM history h
      WHERE h.id1 = b.id1
        AND h.id2 = b.id2
        AND code in ('A', 'B', 'C')
      ORDER BY date DESC, time DESC
      FETCH FIRST ROW ONLY
     ) AS "Recent Code"
FROM item AS b

答案 1 :(得分:1)

您可以在db2中尝试此版本:

select b.id1, b.id2, b.status, 
       (select code
        from history
        where h_id1 = b.id1 and h_id2 = b.id2 and code in ('A', 'B', 'C') 
        order by DATE desc
        fetch first 1 rows only
       ) as RecentCode
from item b