Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:按级别连接具有union的日期类型_Sql_Sql Server_Oracle - Fatal编程技术网

SQL Server:按级别连接具有union的日期类型

SQL Server:按级别连接具有union的日期类型,sql,sql-server,oracle,Sql,Sql Server,Oracle,我已经找到了替换Oracle的“按级别连接”的基本答案,但我的情况稍微复杂一点: 基本上,我要替换的东西如下所示: ... 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

我已经找到了替换Oracle的“按级别连接”的基本答案,但我的情况稍微复杂一点:

基本上,我要替换的东西如下所示:

...
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 CTE1 AS (...),
     CTE2 AS (...)
SELECT stuff FROM CTE1 
UNION ALL
SELECT stuff FROM CTE2;
??这是一个常见的挑战,我想这不是很容易发现,为了使用多个CTE,您只需用逗号分隔它们

总而言之,看起来你只是在尝试生成一系列的日期。一个递归的CTE——不管是一系列的CTE——并不是最有效的方法。与其告诉我们您希望按级别替换CONNECT,并向我们展示您尝试过的语法,不如展示或描述您想要的输出?我们已经感谢你自己尝试了一些东西谢谢!但我们宁愿给你一个有效的解决方案,也不愿把差距缩小到一个低效的解决方案

作为一个例子,这里有一些需要更少冗余代码的东西,think为您提供了您想要的:

DECLARE @n INT = 722, @d DATE = CURRENT_TIMESTAMP;

;WITH v AS (SELECT v FROM (VALUES('ROAD'),('PORTPACK')) AS v(v)),
      n AS (SELECT TOP (@n) n = ROW_NUMBER() OVER (ORDER BY number)
  FROM master.dbo.spt_values ORDER BY n)
SELECT Datelist = DATEADD(DAY, 2-n.n, @d), Tserv_ID = v.v, EQ_NBR = 0
FROM n CROSS JOIN v
ORDER BY Tserv_ID, Datelist;

OP中的最后一句话是正确的,在这里起作用。您得到语法错误的查询是什么?它是正确的,如果仅此一项,我无法使用相同的CTE进行联合,即使用CTE Select。。。。UNIONALL与CTE SELECT URE草书查询在SQL Server 2005中引入。您使用的是哪个版本?@Kris这是因为您的语法错误。在我的回答中,我向您展示了如何结合多个CTE,以及更合理的方法。现在还不确切,因为您无法决定上面的720天和732天,您的原始查询也包括明天,所以我的查询也包括明天,但它应该可以让您非常接近。我想要的输出和原始查询的结果是DATE-732,ROAD,0;日期-731,路,0…日期-732,波特帕克,0;DATE-731、PORTPACK、0等。我只是想遵循一些糟糕的编写代码,因为另一端是非常复杂的crystal report,它的格式正好可以接受这种格式。谢谢,它现在可以工作了。在这个阶段,我不在乎效率。可能值得一提的是,选项maxrecurse 0在这里是一个问题-必须放在查询的底部,或者如果查询保存为完全省略的视图,然后使用选项SELECT*FROM My_query_as_a_view选项maxrecurse 0查看查询。MS SQL 2008 R2的乐趣:/@Kris我不明白为什么在这里需要使用递归CTE。后一个例子不是我提供了一个更具可伸缩性和可读性的方法吗?你的第二个方法更容易,但是如果你不能用declareal创建视图,那么简单地说CRYSTAL甚至不想接受它作为命令:换句话说,我必须坚持CTE
WITH CTE1 AS (...),
     CTE2 AS (...)
SELECT stuff FROM CTE1 
UNION ALL
SELECT stuff FROM CTE2;
DECLARE @n INT = 722, @d DATE = CURRENT_TIMESTAMP;

;WITH v AS (SELECT v FROM (VALUES('ROAD'),('PORTPACK')) AS v(v)),
      n AS (SELECT TOP (@n) n = ROW_NUMBER() OVER (ORDER BY number)
  FROM master.dbo.spt_values ORDER BY n)
SELECT Datelist = DATEADD(DAY, 2-n.n, @d), Tserv_ID = v.v, EQ_NBR = 0
FROM n CROSS JOIN v
ORDER BY Tserv_ID, Datelist;