it-swarm.com.de

Können Sie geschachtelte WITH-Klauseln für Common Table-Ausdrücke erstellen?

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

Funktioniert so etwas? Ich habe es schon früher ausprobiert, konnte es aber nicht schaffen.

155
Joe Phillips

Obwohl nicht streng verschachtelt, können Sie allgemeine Tabellenausdrücke verwenden, um vorherige Abfragen in nachfolgenden Abfragen erneut zu verwenden. 

Um dies zu tun, haben Sie die Form der Aussage, nach der Sie suchen

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

Sie können Folgendes tun, was als rekursive Abfrage bezeichnet wird:

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

Möglicherweise benötigen Sie diese Funktionalität nicht. Ich habe Folgendes getan, um meine Abfragen besser zu organisieren:

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

Mit funktioniert nicht eingebettet, aber es arbeitet fortlaufend

;WITH A AS(
...
),
B AS(
...
)
SELECT *
FROM A
UNION ALL
SELECT *
FROM B

EDIT Die Syntax wurde korrigiert ...

Schauen Sie sich auch das folgende Beispiel an

SQLFiddle DEMO

6
Adriaan Stander

Ich habe versucht, die Zeit zwischen den Ereignissen zu messen, mit Ausnahme dessen, welcher Eintrag mehrere Prozesse zwischen dem Start und dem Ende hat. Das brauchte ich im Zusammenhang mit anderen Single-Line-Prozessen.

Ich habe ein select mit einem inneren Join als meine select-Anweisung im n-ten Cte verwendet. Im zweiten Schritt musste ich das Startdatum für X und das Enddatum für Y extrahieren und 1 als ID-Wert verwenden, um den Link zu verknüpfen, um sie in eine einzige Zeile zu setzen. 

Funktioniert für mich, hoffe das hilft. 

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 
),

.... andere ctes

0
natur3

Diese Antworten sind ziemlich gut, aber wenn Sie die Artikel ordentlich bestellen möchten, sollten Sie diesen Artikel besser betrachten http://dataeducation.com/dr-output-or-how-i- erlernte, um sich zu sorgen, und die Liebe zu verschmelzen

Hier ist ein Beispiel seiner Anfrage.

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
Don Rolling

wir können verschachtelte cte.please erstellen. Siehe das folgende cte im Beispiel

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

select * from cte_data,cte_data1
0
Subhransu Panda