এসকিউএল সার্ভার সিটিই এবং পুনরাবৃত্তির উদাহরণ


109

আমি কখনও পুনরাবৃত্তি সহ সিটিই ব্যবহার করি না। আমি এটি সম্পর্কে একটি নিবন্ধ পড়ছিলাম। এই নিবন্ধটি SQL সার্ভার সিটিই এবং পুনরাবৃত্তির সাহায্যে কর্মচারীদের তথ্য দেখায়। এটি মূলত কর্মচারী এবং তাদের পরিচালকের তথ্য প্রদর্শন করছে। এই ক্যোয়ারীটি কীভাবে কাজ করে তা আমি বুঝতে সক্ষম নই। কোয়েরিটি এখানে:

WITH
  cteReports (EmpID, FirstName, LastName, MgrID, EmpLevel)
  AS
  (
    SELECT EmployeeID, FirstName, LastName, ManagerID, 1
    FROM Employees
    WHERE ManagerID IS NULL
    UNION ALL
    SELECT e.EmployeeID, e.FirstName, e.LastName, e.ManagerID,
      r.EmpLevel + 1
    FROM Employees e
      INNER JOIN cteReports r
        ON e.ManagerID = r.EmpID
  )
SELECT
  FirstName + ' ' + LastName AS FullName,
  EmpLevel,
  (SELECT FirstName + ' ' + LastName FROM Employees
    WHERE EmployeeID = cteReports.MgrID) AS Manager
FROM cteReports
ORDER BY EmpLevel, MgrID

আউটপুটটি কীভাবে প্রদর্শিত হচ্ছে সে সম্পর্কে আমি এখানে পোস্ট করছি: এখানে চিত্র বর্ণনা লিখুন

আমি কেবল এটি প্রথমে পরিচালককে এবং তার লুপটিতে তার অধীনস্থকে কীভাবে দেখায় তা জানতে হবে। আমি অনুমান করি যে প্রথম বর্গক্ষেত্রের বিবৃতিটি কেবল একবারই জ্বলিত হয় এবং এটি সমস্ত কর্মচারী আইডি প্রদান করে।

এবং দ্বিতীয় ক্যোয়ারী বারবার গুলি চালায়, বর্তমান ম্যানেজার আইডির সাথে কর্মচারী কোন ডেটাবেসটি উপস্থিত রয়েছে তা অনুসন্ধান করে।

দয়া করে ব্যাখ্যা করুন কীভাবে স্কিল স্টেটমেন্টটি অভ্যন্তরীণ লুপে কার্যকর করে এবং আমাকে এসকিএল এক্সিকিউশন অর্ডারও জানায়। ধন্যবাদ।

আমার দ্বিতীয় পর্যায়ের প্রশ্নের

;WITH Numbers AS
(
    SELECT n = 1
    UNION ALL
    SELECT n + 1
    FROM Numbers
    WHERE n+1 <= 10
)
SELECT n
FROM Numbers

প্রশ্ন 1) এন এর মান কীভাবে বাড়ছে? যদি মানটি প্রতিবার N কে বরাদ্দ করা হয় তবে এন মান বাড়ানো যেতে পারে তবে কেবলমাত্র প্রথমবার এন মানটি আরম্ভ করা হয়েছিল।

প্রশ্ন 2) সিটিই এবং কর্মচারীদের সম্পর্কের পুনরাবৃত্তি:

যে মুহুর্তে আমি দু'জন পরিচালককে যুক্ত করেছি এবং দ্বিতীয় ব্যবস্থাপকের অধীনে আরও কয়েকজন কর্মচারী যুক্ত করব সেখানেই সমস্যাটি শুরু হয়।

আমি প্রথম ম্যানেজারের বিশদটি এবং পরবর্তী সারিতে প্রদর্শন করতে চাই কেবল সেই কর্মচারীর বিশদ যা সেই ব্যবস্থাপকের অধীনস্থ সম্পর্কিত।

অনুমান করা

ID     Name      MgrID    Level
---    ----      ------   -----
1      Keith      NULL     1
2      Josh       1        2
3      Robin      1        2
4      Raja       2        3
5      Tridip     NULL     1
6      Arijit     5        2
7      Amit       5        2
8      Dev        6        3

আমি সিটিই এক্সপ্রেশন দিয়ে ফলাফলগুলি এভাবে প্রদর্শন করতে চাই। ম্যানেজার-কর্মচারীদের সম্পর্ক টানতে আমি এখানে যে আমার স্কুএলে সংশোধন করব তা আমাকে বলুন। ধন্যবাদ।

আমি আউটপুটটি এর মতো হতে চাই:

ID          Name   MgrID       nLevel      Family
----------- ------ ----------- ----------- --------------------
1           Keith  NULL        1           1
3           Robin  1           2           1
2           Josh   1           2           1
4           Raja   2           3           1
5           Tridip NULL        1           2
7           Amit   5           2           2
6           Arijit 5           2           2
8           Dev    6           3           2

এটা কি সম্ভব...?

উত্তর:


210

আমি আপনার কোডটি পরীক্ষা করি নি, এটি আপনাকে কীভাবে মন্তব্যে পরিচালনা করে তা বুঝতে সহায়তা করার চেষ্টা করেছি;

WITH
  cteReports (EmpID, FirstName, LastName, MgrID, EmpLevel)
  AS
  (
-->>>>>>>>>>Block 1>>>>>>>>>>>>>>>>>
-- In a rCTE, this block is called an [Anchor]
-- The query finds all root nodes as described by WHERE ManagerID IS NULL
    SELECT EmployeeID, FirstName, LastName, ManagerID, 1
    FROM Employees
    WHERE ManagerID IS NULL
-->>>>>>>>>>Block 1>>>>>>>>>>>>>>>>>
    UNION ALL
-->>>>>>>>>>Block 2>>>>>>>>>>>>>>>>>    
-- This is the recursive expression of the rCTE
-- On the first "execution" it will query data in [Employees],
-- relative to the [Anchor] above.
-- This will produce a resultset, we will call it R{1} and it is JOINed to [Employees]
-- as defined by the hierarchy
-- Subsequent "executions" of this block will reference R{n-1}
    SELECT e.EmployeeID, e.FirstName, e.LastName, e.ManagerID,
      r.EmpLevel + 1
    FROM Employees e
      INNER JOIN cteReports r
        ON e.ManagerID = r.EmpID
-->>>>>>>>>>Block 2>>>>>>>>>>>>>>>>>
  )
SELECT
  FirstName + ' ' + LastName AS FullName,
  EmpLevel,
  (SELECT FirstName + ' ' + LastName FROM Employees
    WHERE EmployeeID = cteReports.MgrID) AS Manager
FROM cteReports
ORDER BY EmpLevel, MgrID

একটি পুনরাবৃত্তির সহজ উদাহরণটি CTEএর অপারেশনটি বর্ণনা করার জন্য আমি ভাবতে পারি;

;WITH Numbers AS
(
    SELECT n = 1
    UNION ALL
    SELECT n + 1
    FROM Numbers
    WHERE n+1 <= 10
)
SELECT n
FROM Numbers

প্রশ্ন 1) এন এর মান কীভাবে বাড়ছে। যদি মানটি প্রতিবার N কে নির্ধারিত হয় তবে এন মান বাড়ানো যেতে পারে তবে কেবলমাত্র প্রথমবার এন মানটি আরম্ভ করা হয়েছিল

A1:এই ক্ষেত্রে, Nএকটি পরিবর্তনশীল নয়। Nএকটি উপনাম। এটির সমতুল্য SELECT 1 AS N। এটি ব্যক্তিগত পছন্দের একটি বাক্য গঠন। একটি CTEইন-এ কলামগুলি আলিয়াস করার 2 টি প্রধান পদ্ধতি রয়েছে T-SQL। আমি একটি সহজ এর এনালগ অন্তর্ভুক্ত করেছেন CTEমধ্যে Excelচেষ্টা এবং একটি আরো পরিচিত পথ কী ঘটছে তা মধ্যে চিত্রিত করা।

--  Outside
;WITH CTE (MyColName) AS
(
    SELECT 1
)
-- Inside
;WITH CTE AS
(
    SELECT 1 AS MyColName
    -- Or
    SELECT MyColName = 1  
    -- Etc...
)

Excel_CTE

প্রশ্ন 2) এখন এখানে সিটিই এবং কর্মচারীদের সম্পর্কের পুনরাবৃত্তি সম্পর্কে আমি দু'জন ম্যানেজার যুক্ত করার পরে দ্বিতীয় ম্যানেজারের অধীনে আরও কিছু কর্মচারী যুক্ত করব তারপর সমস্যা শুরু হবে। আমি প্রথম ম্যানেজারের বিশদ প্রদর্শন করতে চাই এবং পরবর্তী সারিতে কেবলমাত্র সেই কর্মচারীর বিবরণই আসবে যারা সেই ব্যবস্থাপকের অধীনস্থ

A2:

এই কোড আপনার প্রশ্নের উত্তর দেয়?

--------------------------------------------
-- Synthesise table with non-recursive CTE
--------------------------------------------
;WITH Employee (ID, Name, MgrID) AS 
(
    SELECT 1,      'Keith',      NULL   UNION ALL
    SELECT 2,      'Josh',       1      UNION ALL
    SELECT 3,      'Robin',      1      UNION ALL
    SELECT 4,      'Raja',       2      UNION ALL
    SELECT 5,      'Tridip',     NULL   UNION ALL
    SELECT 6,      'Arijit',     5      UNION ALL
    SELECT 7,      'Amit',       5      UNION ALL
    SELECT 8,      'Dev',        6   
)
--------------------------------------------
-- Recursive CTE - Chained to the above CTE
--------------------------------------------
,Hierarchy AS
(
    --  Anchor
    SELECT   ID
            ,Name
            ,MgrID
            ,nLevel = 1
            ,Family = ROW_NUMBER() OVER (ORDER BY Name)
    FROM Employee
    WHERE MgrID IS NULL

    UNION ALL
    --  Recursive query
    SELECT   E.ID
            ,E.Name
            ,E.MgrID
            ,H.nLevel+1
            ,Family
    FROM Employee   E
    JOIN Hierarchy  H ON E.MgrID = H.ID
)
SELECT *
FROM Hierarchy
ORDER BY Family, nLevel

গাছের কাঠামো সহ আরও একটি স্কয়ার

SELECT ID,space(nLevel+
                    (CASE WHEN nLevel > 1 THEN nLevel ELSE 0 END)
                )+Name
FROM Hierarchy
ORDER BY Family, nLevel

সিটিই রিকার্সিভ ক্যোয়ারি আমার পছন্দ মতো ফলাফল দেয় না। আমি প্রথমে ম্যানেজারের নামটি প্রদর্শন করতে চাই এবং তারপরে তার সমস্ত অধস্তনকে আবার দ্বিতীয় পরিচালকের নাম প্রদর্শন করতে হবে এবং তারপরে তার সমস্ত অধস্তন প্রদর্শন করতে চাই। আমি চাই আউটপুটটি এই ফ্যাশনে হওয়া উচিত। যদি সম্ভব হয় তবে আপনার প্রশ্নটি আপডেট করুন। ধন্যবাদ
থমাস

[পরিবার] কলাম যুক্ত হয়েছে। এখন দেখ.
মার্কড

এখানে আমি ফলাফলটি প্রদর্শন করতে চাইলে আউটপুটটি দেই। দয়া করে চেক করুন এবং আমাকে বলুন এটি সম্ভব ... যদি হ্যাঁ তবে আপনার স্কয়ারে প্রয়োজনীয় পরিবর্তন করুন। আপনার প্রচেষ্টার জন্য ধন্যবাদ
টমাস

কেন ''; বিবৃতি দিয়ে আগে? ";
উইথ

2
@ সিকনি 8 - লিঙ্কটি মারা গেছে বলে মনে হচ্ছে
2115

11

ইতিমধ্যে একটি সঠিক উত্তরের সাথে একটি সংক্ষিপ্ত শব্দার্থ সমান্তরাল রূপরেখা তৈরি করতে চাই to

'সাধারণ' পদে, একটি পুনরাবৃত্ত সিটিই শব্দার্থগতভাবে নিম্নলিখিত অংশ হিসাবে সংজ্ঞায়িত করা যেতে পারে:

1: সিটিই কোয়েরি। অ্যাঙ্কর নামেও পরিচিত।

2: ইউনিয়ন অল (বা ইউনিয়ন বা এক্সসिप्ट বা ইন্টারস্যাক্ট) এর সাথে সিটিইতে (1) পুনরাবৃত্ত সিটিই কোয়েরি যাতে চূড়ান্ত ফলাফল সেই অনুসারে ফিরে আসে।

3: কোণার / সমাপ্তির শর্ত। কোন ডিফল্টরূপে যখন পুনরাবৃত্তি কোয়েরি দ্বারা আর কোনও সারি / টিপলস ফেরত আসে না।

একটি সংক্ষিপ্ত উদাহরণ যা ছবিটি পরিষ্কার করবে:

;WITH SupplierChain_CTE(supplier_id, supplier_name, supplies_to, level)
AS
(
SELECT S.supplier_id, S.supplier_name, S.supplies_to, 0 as level
FROM Supplier S
WHERE supplies_to = -1    -- Return the roots where a supplier supplies to no other supplier directly

UNION ALL

-- The recursive CTE query on the SupplierChain_CTE
SELECT S.supplier_id, S.supplier_name, S.supplies_to, level + 1
FROM Supplier S
INNER JOIN SupplierChain_CTE SC
ON S.supplies_to = SC.supplier_id
)
-- Use the CTE to get all suppliers in a supply chain with levels
SELECT * FROM SupplierChain_CTE

ব্যাখ্যা: প্রথম সিটিই কোয়েরি বেস সরবরাহকারীদের (পাতার মতো) যারা অন্য কোনও সরবরাহকারীকে সরাসরি সরবরাহ করে না (-1) সরবরাহ করে

প্রথম পুনরাবৃত্তিতে পুনরাবৃত্ত হওয়া ক্যোয়ারী সমস্ত সরবরাহকারী যারা সরবরাহকারীগুলিকে সরবরাহ করে তাদের সরবরাহকারী দ্বারা অ্যাঙ্কার দ্বারা ফিরে আসে। শর্তটি দ্বিগুণ না হওয়া পর্যন্ত এই প্রক্রিয়াটি অব্যাহত থাকে।

ইউনিয়ন সবগুলি মোট পুনরাবৃত্তির কলের উপর দিয়ে সমস্ত টিপল দেয়।

আরও একটি ভাল উদাহরণ পাওয়া যাবে এখানে

পিএস: পুনরাবৃত্ত সিটিইর কাজ করার জন্য, সম্পর্কের কাজ করার জন্য একটি শ্রেণিবদ্ধ (পুনরাবৃত্ত) শর্ত থাকতে হবে। উদাহরণস্বরূপ: এলিমেন্টআইড = এলিমেটেন্ট প্যারেন্টআইড .. আপনি পয়েন্টটি পান।


9

মৃত্যুদন্ড কার্যকর করার পদ্ধতিটি পুনরাবৃত্ত সিটিইর সাথে সত্যিই বিভ্রান্ত করছে, আমি https://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx এ সেরা উত্তর পেয়েছি এবং সিটিই বাস্তবায়ন প্রক্রিয়াটির বিমূর্তির নীচে হিসাবে হয়।

পুনরাবৃত্তির মৃত্যুদণ্ডের শব্দার্থবিজ্ঞান নিম্নরূপ:

  1. সিটিই এক্সপ্রেশনটি অ্যাঙ্কর এবং পুনরাবৃত্ত সদস্যদের মধ্যে বিভক্ত করুন।
  2. প্রথম আমন্ত্রণ বা বেস ফলাফল সেট (টি 0) তৈরি করে অ্যাঙ্কর সদস্য (গুলি) চালান।
  3. ইনপুট হিসাবে টিআই এবং আউটপুট হিসাবে টিআই 1 দিয়ে পুনরাবৃত্তকারী সদস্য (গুলি) চালান।
  4. একটি খালি সেট ফিরে না আসা পর্যন্ত পদক্ষেপ 3 পুনরাবৃত্তি করুন।
  5. ফলাফল সেট ফিরে। এটি TN থেকে Tn এর সমস্ত ইউনিয়ন।

-4
    --DROP TABLE #Employee
    CREATE TABLE #Employee(EmpId BIGINT IDENTITY,EmpName VARCHAR(25),Designation VARCHAR(25),ManagerID BIGINT)

    INSERT INTO #Employee VALUES('M11M','Manager',NULL)
    INSERT INTO #Employee VALUES('P11P','Manager',NULL)

    INSERT INTO #Employee VALUES('AA','Clerk',1)
    INSERT INTO #Employee VALUES('AB','Assistant',1)
    INSERT INTO #Employee VALUES('ZC','Supervisor',2)
    INSERT INTO #Employee VALUES('ZD','Security',2)


    SELECT * FROM #Employee (NOLOCK)

    ;
    WITH Emp_CTE 
    AS
    (
        SELECT EmpId,EmpName,Designation, ManagerID
              ,CASE WHEN ManagerID IS NULL THEN EmpId ELSE ManagerID END ManagerID_N
        FROM #Employee  
    )
    select EmpId,EmpName,Designation, ManagerID
    FROM Emp_CTE
    order BY ManagerID_N, EmpId

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