postgres - sql server cte recursive
¿Puedes crear cláusulas WITH anidadas para Common Table Expressions? (6)
WITH y AS (
WITH x AS (
SELECT * FROM MyTable
)
SELECT * FROM x
)
SELECT * FROM y
¿Funciona algo como esto? Lo intenté antes, pero no pude hacerlo funcionar.
Aunque no está estrictamente anidado, puede usar expresiones de tabla comunes para reutilizar consultas anteriores en las siguientes.
Para hacer esto, la forma de la declaración que está buscando sería
WITH x AS
(
SELECT * FROM MyTable
),
y AS
(
SELECT * FROM x
)
SELECT * FROM y
Con does not work embedded, pero funciona de forma consecutiva
;WITH A AS(
...
),
B AS(
...
)
SELECT *
FROM A
UNION ALL
SELECT *
FROM B
EDIT Reparado la sintaxis ...
Además, eche un vistazo al siguiente ejemplo
DEMO de SQLFiddle
Estaba tratando de medir el tiempo entre los eventos, con la excepción de una entrada que tiene múltiples procesos entre el inicio y el final. Necesitaba esto en el contexto de otros procesos de una sola línea.
Utilicé un seleccionar con una combinación interna como mi declaración seleccionada dentro de la Nth cte. La segunda cte que necesitaba para extraer la fecha de inicio en X y la fecha de finalización en Y y usé 1 como valor de identificación para unirme a la izquierda para ponerlos en una sola línea.
Funciona para mí, espero que esto ayude.
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
),
.... otras ctes
Estas respuestas son bastante buenas, pero en lo que respecta a ordenar los artículos correctamente, sería mejor que miraras este artículo http://sqlblog.com/blogs/adam_machanic/archive/2015/04/07/re-inventing-the-recursive-cte.aspx
Aquí hay un ejemplo de su consulta.
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
Puede hacer lo siguiente, que se conoce como una consulta recursiva:
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
Es posible que no necesite esta funcionalidad. He hecho lo siguiente solo para organizar mejor mis consultas:
WITH y
AS
(
SELECT *
FROM MyTable
WHERE [base_condition]
),
x
AS
(
SELECT *
FROM y
WHERE [something_else]
)
SELECT *
FROM x
podemos crear cte.please anidado ver la siguiente cte en el ejemplo
;with cte_data as
(
Select * from [HumanResources].[Department]
),cte_data1 as
(
Select * from [HumanResources].[Department]
)
select * from cte_data,cte_data1