2014-06-12 79 views
3

在SQL中,是否可以在WITH中放置WITH?是否有可能在SQL中使用WITH 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 
+0

当你尝试了什么事? –

+0

Msg 156,Level 15,State 1,Line 4 关键字'WITH'附近的语法不正确。 Msg 319,Level 15,State 1,Line 4 关键字'with'附近的语法不正确。如果此语句是公用表表达式,xmlnamespaces子句或变更跟踪上下文子句,则前面的语句必须以分号结尾。 Msg 102,Level 15,State 1,Line 12 ')'附近语法不正确。 – pgunston

+0

确保使用* actual * RDBMS标记。 – user2864740

回答

2

不,你不能在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 
0

你通常会做类似下面的;

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更多地视为命名派生表,而不是临时表......尽管它们远不只是派生表

2

根据您的dbms,可以有多个WITH语句,嵌套或不嵌套。 (用PostgreSQL图解说明)SQL Server doesn't allow nesting common table expressions。 (搜索CTE_query_definition

嵌套

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 
 
today 
-- 
2014-06-11 

当你窝公共表表达式,嵌套的CTE不包含它的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 * 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