উত্তর:
কঠোরভাবে নেস্টেড না থাকা অবস্থায়, আপনি পরবর্তী প্রশ্নগুলিতে পুনরায় ব্যবহার করতে সাধারণ টেবিল এক্সপ্রেশন ব্যবহার করতে পারেন।
এটি করার জন্য, আপনি যে বিবৃতিটি সন্ধান করছেন তা ফর্মটি হবে
WITH x AS
(
SELECT * FROM MyTable
),
y AS
(
SELECT * FROM x
)
SELECT * FROM y
আপনি নিম্নলিখিতগুলি করতে পারেন, যা পুনরাবৃত্তির ক্যোয়ারী হিসাবে উল্লেখ করা হয়:
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
আপনার এই কার্যকারিতাটির প্রয়োজন নেই। আমি আমার প্রশ্নগুলি আরও ভাল করে সাজানোর জন্য নিম্নলিখিতগুলি করেছি:
WITH y
AS
(
SELECT *
FROM MyTable
WHERE [base_condition]
),
x
AS
(
SELECT *
FROM y
WHERE [something_else]
)
SELECT *
FROM x
সহ এমবেডড কাজ করে না, তবে এটি টানা কাজ করে
;WITH A AS(
...
),
B AS(
...
)
SELECT *
FROM A
UNION ALL
SELECT *
FROM B
সম্পাদনা বাক্য গঠন স্থির করে ...
এছাড়াও, নিম্নলিখিত উদাহরণটি দেখুন
এই উত্তরগুলি বেশ ভাল, তবে আইটেমগুলি যথাযথভাবে অর্ডার করা হিসাবে আপনি এই নিবন্ধটি দেখলে ভাল হবে http://dataeducation.com/dr-output-or-how-i-learned-to-stop -worrying-এবং-প্রেম-একত্রীকরণ
এখানে তার প্রশ্নের একটি উদাহরণ।
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
শুরু এবং শেষের মধ্যে একাধিক প্রক্রিয়া রয়েছে এমন একটিতে প্রবেশ ব্যতীত আমি ইভেন্টগুলির মধ্যে সময়টি পরিমাপ করার চেষ্টা করছিলাম। অন্যান্য একক লাইন প্রক্রিয়াগুলির প্রসঙ্গে আমার এটির দরকার ছিল।
আমি এনটি সিটির মধ্যে আমার নির্বাচিত বিবৃতি হিসাবে একটি অভ্যন্তরীণ জোড় সহ একটি নির্বাচন ব্যবহার করেছি select দ্বিতীয় সিটিতে আমার এক্সের শুরু তারিখ এবং ওয়াইয়ের শেষের তারিখটি বের করতে হবে এবং এগুলিকে একক লাইনে রাখার জন্য বাম যোগে আইডি মান হিসাবে 1 ব্যবহার করেছি।
আমার জন্য কাজ করে, আশা করি এটি সাহায্য করবে।
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
),
.... অন্যান্য সিটি
নেস্টেড 'উইথ' সমর্থিত নয়, তবে আপনি সর্বদা দ্বিতীয় সহ একটি সাবকিউরি হিসাবে ব্যবহার করতে পারেন, উদাহরণস্বরূপ:
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
আমরা নেস্টেড সিটি তৈরি করতে পারি p উদাহরণস্বরূপ নীচের সিটি দেখুন
;with cte_data as
(
Select * from [HumanResources].[Department]
),cte_data1 as
(
Select * from [HumanResources].[Department]
)
select * from cte_data,cte_data1