2013-04-03 2 views
1

У меня есть база данных 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, и я принимаю большинство других РСУБД).

Если это, по сути, ожидаемое поведение, есть ли другой способ, которым я могу выполнить эту задачу?

ответ

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

Вы можете попробовать эту версию в 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 
Смежные вопросы