0

假设下表;

column name | type
id          | int
date        | varchar

当我使用

SELECT ROWNUMBER() OVER( ORDER BY TYPE_DATE ) as ROWID,
       TO_DATE( date, 'mm\dd\yyyy' ) as TYPE_DATE,
       * 
FROM TABLE

我总是得到以下错误:

SQL0104N an expected token "*" was found following .... <select_sublist>

这里有三个问题:

  1. 为什么不能*在这里使用?
  2. 为什么这个新列不能用于OVER()
  3. 如何获取第二组 10 条记录,按格式化列排序
4

1 回答 1

1

要回答您的第一个问题,这是因为您指定了附加列,而 DB2 无法将其扩展*为列列表。您可以通过添加表标识符FROM TABLE T并使​​用公开的标识符来展开列列表来解决此问题SELECT ..., T.*

正如您在信息中心的这张图表上所见,您只能使用 EITHER *OR 表达式和exposed-name.*

>--+-*-----------------------------------------------+---------><
| .-,-------------------------------------------. |   
| V                                             | |   
'---+-expression--+-------------------------+-+-+-'   
    |             | .-AS-.                  | |       
    |             '-+----+--new-column-name-' |       
    '-exposed-name.*--------------------------'       

对于二和三,列不能通过SELECT别名引用来访问同一子句中函数的值。您可以将其向下推入子选择,然后使用该OVER()功能。然后,您可以通过添加以下内容来获取所需的行BETWEEN

SELECT ROWNUMBER() OVER( ORDER BY TYPE_DATE ) as ROWID, T1.*
FROM (
    SELECT TO_DATE( date, 'mm\dd\yyyy' ) as TYPE_DATE, T.* 
    FROM TABLE T
) T1
WHERE ROWNUMBER() OVER( ORDER BY TYPE_DATE ) BETWEEN 10 AND 20
ORDER BY TYPE_DATE
于 2012-07-05T22:30:35.980 回答