1

我有一个带有两个表的 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

这将返回以下数据:

| 编号 | 描述 | 最后评论 |
| 1 | 假订单 | 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)。

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

4

2 回答 2

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
于 2013-04-03T15:01:13.420 回答
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
于 2013-04-03T14:54:19.380 回答