আপনি কি সাধারণ সারণী এক্সপ্রেশনগুলির জন্য নেস্টেড উইথ ক্লজগুলি তৈরি করতে পারেন?


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

এই কাজ কিছু ভালো লাগে? আমি এটি আগে চেষ্টা করেছি কিন্তু আমি এটি কাজ করতে পারি না।

উত্তর:


301

কঠোরভাবে নেস্টেড না থাকা অবস্থায়, আপনি পরবর্তী প্রশ্নগুলিতে পুনরায় ব্যবহার করতে সাধারণ টেবিল এক্সপ্রেশন ব্যবহার করতে পারেন।

এটি করার জন্য, আপনি যে বিবৃতিটি সন্ধান করছেন তা ফর্মটি হবে

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

2
আপনাকে অনেক ধন্যবাদ. আমি ওরাকল এ এটি করতে পেরেছিলাম: জে এএস (
উইন্ডোজ ডুয়াল

5
এই নেস্টেড নয়
symbiont

13
মূলত পোস্টটির অর্থ হল, আপনি এটি করতে পারবেন না তবে এটি কোনও বড় সমস্যা নয়।
পিটারহ - মনিকা

2
হ্যাঁ, এটি একটি গ্রহণযোগ্য উত্তর কারণ আমি নেস্টিংয়ের সাথে যা অর্জন করার চেষ্টা করছিলাম তা হ'ল এটিই আমাকে শেষ করে দেওয়া শেষ করে
জো ফিলিপস

2
উল্লেখ করা হচ্ছে যে এটি নেস্টেড নয়, কারণ কোয়েরি 2 কোয়েরি 1 এর প্রথম বন্ধুর ভিতরে নেই, এটি দুর্বল আর্গুমেন্টের মতো শোনাচ্ছে। আমি মনে করি এটি নেস্টেড (পুনরাবৃত্তভাবে নেস্টেড নয়), কারণ কোয়েরি 2 কোয়েরি 1 এর ফলাফল ব্যবহার করে, যা নীড় বাঁধার সাথেও ঘটে। সংজ্ঞায়িত করা হয় যে বাসা বাঁধতে কেবল তখনই হতে পারে যখন কোনও শিশু তার প্যারেন্টেসেস (বা অনুরূপ) চিহ্নগুলির মধ্যে থাকে?
ক্রিশ্চিয়ান ওয়েস্টারবিক

11

আপনি নিম্নলিখিতগুলি করতে পারেন, যা পুনরাবৃত্তির ক্যোয়ারী হিসাবে উল্লেখ করা হয়:

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


0

এই উত্তরগুলি বেশ ভাল, তবে আইটেমগুলি যথাযথভাবে অর্ডার করা হিসাবে আপনি এই নিবন্ধটি দেখলে ভাল হবে 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

আমার আসল প্রশ্নটি কখনই ডেটা একত্রিত করার বিষয়ে কিছুই বলেনি। এটি ঠিক তত সহজে ডেটাতে যোগ দিতে পারে
জো ফিলিপস

0

শুরু এবং শেষের মধ্যে একাধিক প্রক্রিয়া রয়েছে এমন একটিতে প্রবেশ ব্যতীত আমি ইভেন্টগুলির মধ্যে সময়টি পরিমাপ করার চেষ্টা করছিলাম। অন্যান্য একক লাইন প্রক্রিয়াগুলির প্রসঙ্গে আমার এটির দরকার ছিল।

আমি এনটি সিটির মধ্যে আমার নির্বাচিত বিবৃতি হিসাবে একটি অভ্যন্তরীণ জোড় সহ একটি নির্বাচন ব্যবহার করেছি 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 
),

.... অন্যান্য সিটি


0

নেস্টেড 'উইথ' সমর্থিত নয়, তবে আপনি সর্বদা দ্বিতীয় সহ একটি সাবকিউরি হিসাবে ব্যবহার করতে পারেন, উদাহরণস্বরূপ:

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

-1

আমরা নেস্টেড সিটি তৈরি করতে পারি p উদাহরণস্বরূপ নীচের সিটি দেখুন

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

select * from cte_data,cte_data1

4
আপনি পার্টিতে কিছুটা দেরী করেছেন;)
জো ফিলিপস

4
এবং এটি ধারাবাহিক সিটিই, নেস্টেড সিটিই নয়
মেওয়ার 68
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.