WITH y AS (
WITH x AS (
SELECT * FROM MyTable
)
SELECT * FROM x
)
SELECT * FROM y
Có một cái gì đó như thế này làm việc? Tôi đã thử nó sớm hơn nhưng tôi không thể làm cho nó hoạt động.
WITH y AS (
WITH x AS (
SELECT * FROM MyTable
)
SELECT * FROM x
)
SELECT * FROM y
Có một cái gì đó như thế này làm việc? Tôi đã thử nó sớm hơn nhưng tôi không thể làm cho nó hoạt động.
Câu trả lời:
Mặc dù không được lồng hoàn toàn, bạn có thể sử dụng các biểu thức bảng chung để sử dụng lại các truy vấn trước đó trong các truy vấn tiếp theo.
Để làm điều này, hình thức của tuyên bố bạn đang tìm kiếm sẽ là
WITH x AS
(
SELECT * FROM MyTable
),
y AS
(
SELECT * FROM x
)
SELECT * FROM y
Bạn có thể thực hiện các thao tác sau, được gọi là truy vấn đệ quy:
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
Bạn có thể không cần chức năng này. Tôi đã làm như sau chỉ để tổ chức các truy vấn của tôi tốt hơn:
WITH y
AS
(
SELECT *
FROM MyTable
WHERE [base_condition]
),
x
AS
(
SELECT *
FROM y
WHERE [something_else]
)
SELECT *
FROM x
Với không hoạt động nhúng, nhưng nó hoạt động liên tiếp
;WITH A AS(
...
),
B AS(
...
)
SELECT *
FROM A
UNION ALL
SELECT *
FROM B
EDIT Đã sửa lỗi cú pháp ...
Ngoài ra, hãy xem ví dụ sau
Những câu trả lời này khá tốt, nhưng khi có được các mặt hàng để đặt hàng đúng cách, bạn nên xem bài viết này http://dataeducation.com/dr-output-or-how-i-learned-to-stop lo lắng-và-yêu-hợp nhất
Đây là một ví dụ về truy vấn của anh ấy.
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
Tôi đã cố gắng đo thời gian giữa các sự kiện ngoại trừ mục nào có nhiều quá trình giữa bắt đầu và kết thúc. Tôi cần điều này trong bối cảnh của các quy trình đơn dòng khác.
Tôi đã sử dụng một lựa chọn với một tham gia bên trong như là tuyên bố lựa chọn của tôi trong cte Nth. Cte thứ hai tôi cần để trích xuất ngày bắt đầu trên X và ngày kết thúc trên Y và sử dụng 1 làm giá trị id cho phép nối trái để đặt chúng trên một dòng duy nhất.
Làm việc cho tôi, hy vọng điều này sẽ giúp.
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
),
.... các byte khác
Nested 'With' không được hỗ trợ, nhưng bạn luôn có thể sử dụng With thứ hai như một truy vấn con, ví dụ:
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
chúng ta có thể tạo cte lồng nhau. Xin vui lòng xem cte dưới đây trong ví dụ
;with cte_data as
(
Select * from [HumanResources].[Department]
),cte_data1 as
(
Select * from [HumanResources].[Department]
)
select * from cte_data,cte_data1