首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据其他CTE的结果生成CTE

根据其他CTE的结果生成CTE
EN

Stack Overflow用户
提问于 2013-06-15 05:26:42
回答 2查看 128关注 0票数 0

我有几个加入了CTE。类似于:

代码语言:javascript
复制
;With CT1 AS(SELECT ..)
, CT2 AS(select)
SELECT *.T1,*T2 FROM CT1 T1 INNER JOIN CT2 T2 WHERE (some Condition ) GROUP BY (F1,F2, etc)

现在我需要将这个查询的结果连接到另一个CTE。最好的方法是什么?我能用这个查询的结果做一个CTE吗?任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-15 08:45:06

您可以继续基于先前定义的CTE创建新的CTE。它们可以合并或合并,但须遵守CTE的规则。

代码语言:javascript
复制
; with
  ArabicRomanConversions as (
    select *
      from ( values
        ( 0, '', '', '', '' ), ( 1, 'I', 'X', 'C', 'M' ), ( 2, 'II', 'XX', 'CC', 'MM' ), ( 3, 'III', 'XXX', 'CCC', 'MMM' ), ( 4, 'IV', 'XL', 'CD', '?' ),
        ( 5, 'V', 'L', 'D', '?' ), ( 6, 'VI', 'LX', 'DC', '?' ), ( 7, 'VII', 'LXX', 'DCC', '?' ), ( 8, 'VIII', 'LXXX', 'DCCC', '?' ), ( 9, 'IX', 'XC', 'CM', '?' )
        ) as Placeholder ( Arabic, Ones, Tens, Hundreds, Thousands )
      ),
  Numbers as (
    select 1 as Number
    union all
    select Number + 1
      from Numbers
      where Number < 3999 ),
  ArabicAndRoman as (
    select Number as Arabic,
      ( select Thousands from ArabicRomanConversions where Arabic = Number / 1000 ) +
      ( select Hundreds from ArabicRomanConversions where Arabic = Number / 100 % 10 ) +
      ( select Tens from ArabicRomanConversions where Arabic = Number / 10 % 10 ) +
      ( select Ones from ArabicRomanConversions where Arabic = Number % 10 ) as Roman
      from Numbers ),
  Squares as (
    select L.Arabic, L.Roman, R.Arabic as Square, R.Roman as RomanSquare
      from ArabicAndRoman as L inner join
        ArabicAndRoman as R on R.Arabic = L.Arabic * L.Arabic
      where L.Arabic < 16 ),
  Cubes as (
    select S.Arabic, S.Roman, S.Square, S.RomanSquare, A.Arabic as Cube, A.Roman as RomanCube
      from Squares as S inner join
        ArabicAndRoman as A on A.Arabic = S.Square * S.Arabic )
  select *
    from Cubes
    order by Arabic
    option ( MaxRecursion 3998 )
票数 2
EN

Stack Overflow用户

发布于 2013-06-15 09:34:40

这是一种我已经使用过几次的格式,其中使用临时表来缓冲一个复杂的CTE,该CTE被输出,然后通过第二个CTE从temp再次使用。

如果您需要2个结果集,或者如果完整的CTE作为一个庞大的语句导致速度问题(在某些情况下,拆分它可能会带来巨大的性能提升),它是很有用的。

代码语言:javascript
复制
-- I do this "DROP" because in some cases where query is executed over and 
-- over sometimes the object is not cleared before next transaction.
BEGIN TRY DROP TABLE #T_A END TRY BEGIN CATCH END CATCH;

WITH A AS (
    SELECT 'A' AS Name, 1 as Value
    UNION ALL SELECT 'B', 2
)
SELECT *
INTO #T_A
FROM A;

SELECT *
FROM #T_A ; -- Generate First Output Table

WITH B AS (
    SELECT 'A' AS Name, 234 as Other
    UNION ALL SELECT 'B', 456
)
-- Generate second result set from Temp table.
SELECT B.*, A. Value
FROM B  JOIN #T_A AS A ON A.Name=B.Name

这会产生一个2表的结果集。这在填充DataSet的.NET中也很方便。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17117541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档