Können Sie für Common Table Expressions MIT Klauseln verschachtelt schaffen?
-
06-07-2019 - |
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.
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