【发布时间】:2014-01-08 04:13:47
【问题描述】:
我找到了替换 Oracle 的“CONNECT BY LEVEL”in this question 的基本答案,但我的情况有点复杂:
基本上我要替换的东西是这样的:
...
UNION ALL
Select
adate, 'ROAD' as TSERV_ID, 0 AS EQ_NBR
from
(SELECT
to_date(sysdate - 732,'dd/mm/yy') + rownum -1 as adate, rownum
FROM
(select rownum
from dual
connect by level <= 732)
WHERE rownum <= 732)
UNION ALL
Select
adate, 'PORTPACK' as TSERV_ID, 0 AS EQ_NBR
from
(SELECT
to_date(sysdate - 732,'dd/mm/yy') + rownum -1 as adate, rownum
FROM
(select rownum from dual connect by level <= 732)
WHERE rownum <= 732)
UNION ALL
....
现在,单双连接很容易,即使这显然不是很有效的方法
WITH CTE AS (
SELECT dateadd(day,-720,CONVERT (date, GETDATE())) as Datelist
UNION ALL
SELECT dateadd(day,1,Datelist)
FROM CTE
WHERE datelist < getdate() )
SELECT *,'ROAD' as Tserv_ID , 0 as EQ_NBR FROM CTE
option (maxrecursion 0)
重复联合很难,因为我收到错误:
关键字“with”附近的语法不正确。如果这个语句是一个公用表表达式、一个 xmlnamespaces 子句或一个更改跟踪上下文子句,则前面的语句必须以分号结束。
我在这里提供了这个联合的更多部分;我尝试仅在开始时使用“WITH”,但没有运气。我在这里遗漏了什么明显的东西吗?
编辑:当然有一个很大的问题,为什么我什至要尝试做这样的事情:就我个人而言,我不会,但在查询的另一端有一个巨大的水晶报表,每个月运行一次,它接受这种特定格式的数据。完整查询输出的结尾类似于
3 columns of data
3 Columns of data
...
Currentdate-732,"ROAD",0
Currentdate -731,"ROAD",0
...
Currentdate, "ROAD,"0"
Currentdate -732, "PORTPAK", 0
Currentdate -731, "PORTPAK", 0
等等
【问题讨论】:
-
OP 中的最后一条语句是正确的并且在此处有效 (sqlfiddle.com/#!6/d41d8/13594)。您收到语法错误的查询是什么?
-
这是正确的,如果单独使用,我无法使用相同的 CTE 进行联合,即 WITH CTE (Select....) UNION ALL WITH CTE (SELECT) U
-
SQL Server 2005 中引入的递归查询。您使用的是哪个版本?
-
@Kris 那是因为您的语法错误。在我的回答中,我向您展示了如何组合多个 CTE(以及更合理的方法)。现在不准确,因为您无法在上面的 720 天和 732 天之间做出决定,而且您的原始查询还包括明天(所以我的也是如此),但它应该让您非常接近。
标签: sql sql-server oracle