我有一个带有两个表的db2数据库;我们称他们为order
和order_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)。
如果这实际上是预期的行为,还有其他方法可以完成这项任务吗?
答案 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