Frage

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

Gibt es so etwas wie diese Arbeit? Ich versuchte es früher, aber ich konnte es nicht arbeiten.

War es hilfreich?

Lösung

Während nicht streng verschachtelt, können Sie allgemeine Tabellenausdrücke verwenden, um früheren Abfragen in den nachfolgenden diejenigen wiederverwenden.

Um dies zu tun, die Form der Aussage von Ihnen gesuchten wäre

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

Andere Tipps

Sie können die folgenden Aktionen, die als eine 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

Sie können diese Funktionalität nicht benötigen. Ich habe die folgende nur getan, um meine Fragen besser zu organisieren:

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

Mit nicht eingebettet arbeiten, aber es funktioniert in Folge

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

Bearbeiten Feste der Syntax ...

Auch haben einen Blick auf das folgende Beispiel

SQLFiddle DEMO

Diese Antworten ziemlich gut, aber so weit wie die Produkte immer richtig zu bestellen, dann würden Sie in diesem Artikel suchen besser dran http: // dataeducation.com/dr-output-or-how-i-learned-to-stop-worrying-and-love-the-merge

Hier ist ein Beispiel für seine Abfrage.

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

Wir können verschachtelten cte.please sehen erstellen die folgenden CTE in Beispiel

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

select * from cte_data,cte_data1

Ich habe versucht, die Zeit zwischen den Ereignissen mit Ausnahme dessen, was einen Eintrag zu messen, die mehrere Prozesse zwischen Anfang und Ende hat. Ich brauchte diese in Zusammenhang mit anderen einzelnen Zeile Prozesse.

habe ich ein Auswahl mit einem inneren als meine select-Anweisung innerhalb der N-ten CTE beizutreten. Die zweite CTE I benötigt, um das Startdatum auf X und Y auf Enddatum zu extrahieren und verwenden 1 als einen ID-Wert nach links verbinden sie in einer einzigen Zeile zu setzen.

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

.... anderes ctes

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top