共通テーブル式のネストされたWITH句を作成できますか?


回答:


302

厳密にネストされていませんが、共通のテーブル式を使用して、前のクエリを後続のクエリで再利用できます。

これを行うには、探しているステートメントの形式は次のようになります

WITH x AS 
(
    SELECT * FROM MyTable
), 
y AS 
(
    SELECT * FROM x
)
SELECT * FROM y

2
どうもありがとうございました。私はOracleでそれを行うことができました:WITH J AS(SELECT 1 AS ONE FROM DUAL)、Q AS(SELECT J. *、2 AS TWO FROM J)SELECT * FROM Q
Jason TEPOORTEN

5
これはネストされていません
symbiont

14
基本的に、投稿はそれができないこと意味しますが、大きな問題ではありません。
peterh-モニカを2017年

2
はい、これは許容できる答えです。なぜなら、入れ子で達成しようとしていたことは、結局それが私に与える結果と同じだからです
Joe Phillips

2
クエリ2がクエリ1の括弧内にないため、これがネストされていないことを示すと、弱い引数のように聞こえます。クエリ2はクエリ1の結果を使用するため、ネストされている(再帰的にネストされていない)と思います。これは、ネストでも発生するクエリ1の結果です。ネストは、子がその親括弧(または同様の)シンボル内にある場合にのみ可能であると定義されていますか?
Christiaan Westerbeek

11

再帰クエリと呼ばれる次の操作を実行できます。

WITH y
AS
(
  SELECT x, y, z
  FROM MyTable
  WHERE [base_condition]

  UNION ALL

  SELECT x, y, z
  FROM MyTable M
  INNER JOIN y ON M.[some_other_condition] = y.[some_other_condition]
)
SELECT *
FROM y

この機能は必要ない場合があります。クエリを整理するために、次のことを行いました。

WITH y 
AS
(
  SELECT * 
  FROM MyTable
  WHERE [base_condition]
),
x
AS
(
  SELECT * 
  FROM y
  WHERE [something_else]
)
SELECT * 
FROM x


0

これらの答えはかなり良いですが、アイテムを適切に注文するためには、この記事をご覧になる方がよいでしょう 。http://dataeducation.com/dr-output-or-how-i-learned-to-stop -心配して好きなマージ

これが彼のクエリの例です。

WITH paths AS ( 
    SELECT 
        EmployeeID, 
        CONVERT(VARCHAR(900), CONCAT('.', EmployeeID, '.')) AS FullPath 
    FROM EmployeeHierarchyWide 
    WHERE ManagerID IS NULL

    UNION ALL

    SELECT 
        ehw.EmployeeID, 
        CONVERT(VARCHAR(900), CONCAT(p.FullPath, ehw.EmployeeID, '.')) AS FullPath 
    FROM paths AS p 
        JOIN EmployeeHierarchyWide AS ehw ON ehw.ManagerID = p.EmployeeID 
) 
SELECT * FROM paths order by FullPath

元の質問では、データの結合について何も言われていません。それはデータを結合するのと同じくらい簡単だったかもしれません
ジョー・フィリップス

0

開始と終了の間に複数のプロセスを持つ1つのエントリを除いて、イベント間の時間を測定しようとしました。他の単一行プロセスのコンテキストでこれが必要でした。

N番目のcte内で、selectステートメントとして内部結合のあるselectを使用しました。Xの開始日とYの終了日を抽出する必要がある2番目のcteは、1つの行に配置するために左結合のid値として1を使用しました。

私にとってはうまくいきます。これが役に立てば幸いです。

cte_extract
as 
(
    select ps.Process as ProcessEvent
        , ps.ProcessStartDate 
        , ps.ProcessEndDate 
        -- select strt.*
    from dbo.tbl_some_table ps 
    inner join (select max(ProcessStatusId) ProcessStatusId 
                    from dbo.tbl_some_table 
                where Process = 'some_extract_tbl' 
                and convert(varchar(10), ProcessStartDate, 112) < '29991231'
                ) strt on strt.ProcessStatusId = ps.ProcessStatusID
), 
cte_rls
as 
(
    select 'Sample' as ProcessEvent, 
     x.ProcessStartDate, y.ProcessEndDate  from (
    select 1 as Id, ps.Process as ProcessEvent
        , ps.ProcessStartDate 
        , ps.ProcessEndDate
        -- select strt.*
    from dbo.tbl_some_table ps 
    inner join (select max(ProcessStatusId) ProcessStatusId 
                    from dbo.tbl_some_table 
                where Process = 'XX Prcss' 
                and convert(varchar(10), ProcessStartDate, 112) < '29991231'
                ) strt on strt.ProcessStatusId = ps.ProcessStatusID
    ) x
    left join (
        select 1 as Id, ps.Process as ProcessEvent
            , ps.ProcessStartDate 
            , ps.ProcessEndDate
            -- select strt.*
        from dbo.tbl_some_table ps 
        inner join (select max(ProcessStatusId) ProcessStatusId
                    from dbo.tbl_some_table 
                    where Process = 'YY Prcss Cmpltd' 
                    and convert(varchar(10), ProcessEndDate, 112) < '29991231'
                    ) enddt on enddt.ProcessStatusId = ps.ProcessStatusID
            ) y on y.Id = x.Id 
),

....その他の引用


0

ネストされた「With」はサポートされていませんが、2番目のWithをサブクエリとしていつでも使用できます。次に例を示します。

WITH A AS (
                --WITH B AS ( SELECT COUNT(1) AS _CT FROM C ) SELECT CASE _CT WHEN 1 THEN 1 ELSE 0 END FROM B --doesn't work
                SELECT CASE WHEN count = 1 THEN 1 ELSE 0 END AS CT FROM (SELECT COUNT(1) AS count FROM dual)
                union all
                select 100 AS CT from dual
           )
              select CT FROM A

-1

ネストされたcteを作成できます。以下のcteの例を参照してください

;with cte_data as 
(
Select * from [HumanResources].[Department]
),cte_data1 as
(
Select * from [HumanResources].[Department]
)

select * from cte_data,cte_data1

4
あなたはパーティーに少し遅れます;)
Joe Phillips

4
ネストされたCTEではなく、連続したCTE
Meower68
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.