在SQL中是否可以在WITH中使用WITH
在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 >
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