Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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中是否可以在WITH中使用WITH_Sql_View - Fatal编程技术网

在SQL中是否可以在WITH中使用WITH

在SQL中是否可以在WITH中使用WITH,sql,view,Sql,View,在SQL中,是否可以将WITH放在WITH中 以下面的查询为例 WITH Temp ([Description], [Amount], [OverdueBy]) AS (select Description, SUM(Amount) as Amount, (DATEDIFF(day,DueDate,GETDATE())) as OverdueBy from brvAPAllInvoices Where PaidDate is null and APCo = 1 and Amount >

在SQL中,是否可以将WITH放在WITH中

以下面的查询为例

WITH Temp ([Description], [Amount], [OverdueBy])
AS 
(select Description, SUM(Amount) as Amount, (DATEDIFF(day,DueDate,GETDATE())) as OverdueBy  from brvAPAllInvoices 
Where PaidDate is null and APCo = 1 and Amount > 0 
Group By Description, DueDate, APRef

)

select * from Temp
我想基于上述查询创建一个“虚拟”临时表。是否可以使用另一个WITH将其包含在中

大致如下:

WITH Temp2 ([Description], [Amount], [OverdueBy])
AS
(
WITH Temp ([Description], [Amount], [OverdueBy])
AS 
(select Description, SUM(Amount) as Amount, (DATEDIFF(day,DueDate,GETDATE())) as OverdueBy  from brvAPAllInvoices 
Where PaidDate is null and APCo = 1 and Amount > 0 
Group By Description, DueDate, APRef

)

select * from Temp)

select * from Temp2

不,不能在CTE中定义CTE,但可以在一条语句中定义多个CTE并引用其他CTE

; with a as (
    select * from some_table
),
b as (
   select * 
   from another_table t
     inner join a ON (t.key = a.key)
)
select * 
from b

您通常会执行以下操作:

WITH Temp ([Description], [Amount], [OverdueBy])
AS 
(select Description, SUM(Amount) as Amount, (DATEDIFF(day,DueDate,GETDATE())) as OverdueBy  from brvAPAllInvoices 
Where PaidDate is null and APCo = 1 and Amount > 0 
Group By Description, DueDate, APRef
), Temp2 ([Description], [Amount], [OverdueBy]) AS 
(
    SELECT * FROM Temp
)
select * from Temp2

尽管在您设计的示例中,这显然没有多大用处,因为两个表结构几乎相同。我倾向于认为CTE更像是命名的派生表,而不是临时表……尽管它们不仅仅是一个派生表,这取决于您的dbms,但您可以有多个WITH语句,嵌套或不嵌套。(以PostgreSQL为例)。(搜索CTE_查询_定义。)

嵌套的

with today as (
  with yesterday as (select current_date - interval '1' day as yesterday)
  select yesterday + interval '1' day as today from yesterday 
)
select cast(today as date) from today
with yesterday as (
  select current_date - interval '1' day as yesterday
), 
today as (
  select yesterday + interval '1' day as today from yesterday 
)
select cast(yesterday as date) as dates from yesterday
union all
select cast(today as date) from today
错误:关系“昨天”不存在
尝试时发生了什么?Msg 156,级别15,状态1,第4行关键字“WITH”附近的语法不正确。Msg 319,15级,状态1,第4行关键字“with”附近语法不正确。如果此语句是公共表表达式、xmlnamespaces子句或更改跟踪上下文子句,则前一条语句必须以分号终止。Msg 102,第15级,状态1,第12行“')附近的语法不正确。请确保使用实际使用的RDBMS进行标记。
with today as (
  with yesterday as (select current_date - interval '1' day as yesterday)
  select yesterday + interval '1' day as today from yesterday 
)
select * from yesterday
ERROR: relation "yesterday" does not exist
with yesterday as (
  select current_date - interval '1' day as yesterday
), 
today as (
  select yesterday + interval '1' day as today from yesterday 
)
select cast(yesterday as date) as dates from yesterday
union all
select cast(today as date) from today
dates -- 2014-06-10 2014-06-11
with today as (
  select yesterday + interval '1' day as today from yesterday 
),
yesterday as (
  select current_date - interval '1' day as yesterday
) 
select yesterday from yesterday
union all
select today from today
ERROR: relation "yesterday" does not exist