পুনরাবৃত্ত হওয়া সাধারণ টেবিল এক্সপ্রেশনটিতে EXCEPT ব্যবহার করা


33

নিম্নলিখিত কোয়েরি কেন অসীম সারি ফেরায়? আমি EXCEPTক্লজটি পুনরাবৃত্তিটি বন্ধ করার প্রত্যাশা করতাম ..

with cte as (
    select *
    from (
        values(1),(2),(3),(4),(5)
    ) v (a)
)
,r as (
    select a
    from cte
    where a in (1,2,3)
    union all
    select a
    from (
        select a
        from cte
        except
        select a
        from r
    ) x
)
select a
from r

স্ট্যাক ওভারফ্লো সম্পর্কে একটি প্রশ্নের উত্তর দেওয়ার সময় আমি এটি পেরিয়ে এসেছি ।

উত্তর:


26

পুনরাবৃত্ত সিটিই- র বর্তমান অবস্থা সম্পর্কে তথ্যের জন্য মার্টিন স্মিথের উত্তর দেখুন EXCEPT

আপনি কী দেখছিলেন এবং কেন তা বোঝানোর জন্য:

অ্যাঙ্কর মান এবং পুনরাবৃত্ত আইটেমটি পরিষ্কার করার (এটি শব্দার্থক পরিবর্তন করে না) মধ্যে পার্থক্য তৈরি করতে আমি এখানে একটি টেবিল পরিবর্তনশীল ব্যবহার করছি।

DECLARE @V TABLE (a INTEGER NOT NULL)
INSERT  @V (a) VALUES (1),(2)
;
WITH rCTE AS 
(
    -- Anchor
    SELECT
        v.a
    FROM @V AS v

    UNION ALL

    -- Recursive
    SELECT
        x.a
    FROM
    (
        SELECT
            v2.a
        FROM @V AS v2

        EXCEPT

        SELECT
            r.a
        FROM rCTE AS r
    ) AS x
)
SELECT
    r2.a
FROM rCTE AS r2
OPTION (MAXRECURSION 0)

ক্যোয়ারী পরিকল্পনাটি হ'ল:

পুনরাবৃত্তি সিটিই পরিকল্পনা

পরিকল্পনার মূল নির্ধারন (SELECT) থেকে শুরু হয় এবং নিয়ন্ত্রণ গাছটিকে নীচে সূচক স্পুল, কনটেনটেশন এবং তারপরে উপরের স্তরের টেবিল স্ক্যানের দিকে নিয়ে যায়।

স্ক্যান থেকে প্রথম সারিটি গাছের উপর দিয়ে যায় এবং এটি (ক) স্ট্যাক স্পুলে সঞ্চিত হয় এবং (খ) ক্লায়েন্টকে ফিরে আসে। প্রথমে কোন সারিটি সংজ্ঞায়িত করা হয়নি, তবে আসুন আমরা ধরে নিই যে এটি যুক্তির জন্য for 1} মান সহ সারি। প্রদর্শিত প্রথম সারিটি তাই {1}}

নিয়ন্ত্রণ আবার টেবিল স্ক্যানে চলে যায় (কনক্যাটেনশন অপারেটর পরবর্তী খোলার আগে তার বহিরাগত ইনপুট থেকে সমস্ত সারি গ্রাস করে)। স্ক্যানটি দ্বিতীয় সারিটি নির্ধারণ করে (মান {2}), এবং এটি ক্লায়েন্টের কাছে স্ট্যাক এবং আউটপুটে সংরক্ষণের জন্য গাছটিকে আবার সরিয়ে দেয়। ক্লায়েন্টটি এখন ক্রমটি {1}, {2 received পেয়েছে}

LIFO স্ট্যাকের শীর্ষটি বাম দিকে রয়েছে এমন একটি কনভেনশন গ্রহণ, স্ট্যাকটিতে এখন {2, 1} রয়েছে} নিয়ন্ত্রণটি আবার টেবিল স্ক্যানে চলে যাওয়ার সাথে সাথে এটি আর সারিগুলির আর কোনও খবর দেয় না, এবং নিয়ন্ত্রণটি কনটেনটেশন অপারেটরের কাছে ফিরে যায়, এটি তার দ্বিতীয় ইনপুটটি খোলে (স্ট্যাকের স্পুল পর্যন্ত যাওয়ার জন্য এটি একটি সারি প্রয়োজন), এবং নিয়ন্ত্রণটি অভ্যন্তরীণ যোগে প্রবেশ করে প্রথমবার.

অভ্যন্তরীণ যোগদানটি তার বাইরের ইনপুটটিতে টেবিল স্পুলকে কল করে, যা স্ট্যাক {2} থেকে শীর্ষ সারিটি পড়ে এবং এটি ওয়ার্কটেবল থেকে মুছে দেয়। স্ট্যাকটিতে এখন {1} রয়েছে}

বাহ্যিক ইনপুটটিতে একটি সারি পেয়ে, অভ্যন্তরীণ জোড় বাম অ্যান্টি-সেমি জোনে (এলএএসজে) এর অভ্যন্তরীণ ইনপুটটি নিয়ন্ত্রণ করে। এটি তার বাহ্যিক ইনপুট থেকে একটি সারি অনুরোধ করে, বাছাইয়ের উপর নিয়ন্ত্রণ রেখে। বাছাই হ'ল একটি ব্লকিং পুনরুক্তি, সুতরাং এটি সারণী ভেরিয়েবল থেকে সমস্ত সারি পড়বে এবং সেগুলি আরোহণের (যেমন এটি ঘটে) সাজিয়ে তোলে।

বাছাইয়ের দ্বারা নির্গত প্রথম সারিতে তাই মান {1}} এলএএসজে-র অভ্যন্তরীণ দিকটি পুনরাবৃত্ত সদস্যের বর্তমান মান প্রদান করে (মানটি কেবল স্ট্যাকের বাইরে বেরিয়ে যায়), যা {2}} LASJ এ মানগুলি {1} এবং {2 {তাই {1 e নির্গত হয়, যেহেতু মানগুলি মেলে না।

এই সারি {1} ক্যোয়ারী প্ল্যান ট্রিটিকে সূচক (স্ট্যাক) স্পুলে প্রবাহিত করে যেখানে এটি স্ট্যাকের সাথে যুক্ত করা হয়, যেখানে এখন {1, 1 contains রয়েছে এবং ক্লায়েন্টে নির্গত হয়। ক্লায়েন্টটি এখন ক্রমটি {1}, {2}, {1 received পেয়েছে}

কন্ট্রোল এখন কনটিকেটেশনে ফিরে যায়, অভ্যন্তরীণ দিকের পিছনে পিছনে ফিরে (এটি শেষবারের মতো একটি সারিতে ফিরে এসেছিল, আবারও করতে পারে), ইনার জয়েন্টের মাধ্যমে, এলএএসজে নামিয়ে। এটি পুনরায় তার অভ্যন্তরীণ ইনপুটটি পড়ায়, বাছাই করা থেকে {2 value মান প্রাপ্ত করে।

পুনরাবৃত্তকারী সদস্যটি এখনও {2 is, সুতরাং এবার এলএএসজে {2} এবং {2 finds সন্ধান করে, যার ফলে কোনও সারি নির্গত হয় না। এর অভ্যন্তরীণ ইনপুটটিতে আর কোনও সারি খুঁজে পাওয়া যাচ্ছে না (সাজান এখন সারিগুলির বাইরে চলে গেছে), নিয়ন্ত্রণটি অভ্যন্তরীণ যোগদানের পরে ফিরে যায়।

অভ্যন্তরীণ জোড় তার বাইরের ইনপুটটি পড়ে, যার ফলস্বরূপ {1} স্ট্যাকটি ped 1, 1 pop থেকে পপ হয়ে যায়, স্ট্যাকটি কেবল {1} দিয়ে ছেড়ে যায়} প্রক্রিয়াটি এখন সারণী স্ক্যান এবং বাছাইয়ের একটি নতুন অনুরোধ থেকে এলএএসজে পরীক্ষায় উত্তীর্ণ হওয়ার পরে এবং স্ট্যাকের সাথে যুক্ত হওয়ার পরে {2 value মানের সাথে পুনরাবৃত্তি করে এবং ক্লায়েন্টের কাছে পাস করে, যা এখন {1}, {2} পেয়েছে, {1}, {2} ... এবং আমরা যেতে পারি।

রিকার্সিভ সিটিই পরিকল্পনাগুলিতে ব্যবহৃত স্ট্যাক স্পুল সম্পর্কে আমার প্রিয় ব্যাখ্যা হ'ল ক্রেগ ফ্রিডম্যান।


31

রিকার্সিভ সিটিইগুলির বিওএল বর্ণনায় রিকার্সিভ এক্সিকিউশন এর শব্দার্থকে বর্ণনা করা হয়েছে:

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

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

আপনার সিটিইতে এটি প্রয়োগ করে আমি নিম্নলিখিত প্যাটার্ন সহ একটি অসীম লুপ আশা করব

+-----------+---------+---+---+---+
| Invocation| Results             |
+-----------+---------+---+---+---+
|         1 |       1 | 2 | 3 |   |
|         2 |       4 | 5 |   |   |
|         3 |       1 | 2 | 3 |   |
|         4 |       4 | 5 |   |   |
|         5 |       1 | 2 | 3 |   |
+-----------+---------+---+---+---+ 

কারণ

select a
from cte
where a in (1,2,3)

অ্যাঙ্কর এক্সপ্রেশন। এটা স্পষ্ট ফেরৎ 1,2,3যেমনT0

এরপরে পুনরাবৃত্তির অভিব্যক্তি চলে

select a
from cte
except
select a
from r

সঙ্গে 1,2,3ইনপুট যে একটি আউটপুট উত্পাদ হবে 4,5যেমন T1তারপর পুনরাবৃত্তির পরের বারে ফিরে আসবে জন্য যে আবার লাগালে 1,2,3এবং তাই অনির্দিষ্টকালের জন্য।

এটি আসলে যা ঘটে তা নয়। এগুলি প্রথম 5 টি আমন্ত্রণের ফলাফল

+-----------+---------+---+---+---+
| Invocation| Results             |
+-----------+---------+---+---+---+
|         1 |       1 | 2 | 3 |   |
|         2 |       1 | 2 | 4 | 5 |
|         3 |       1 | 2 | 3 | 4 |
|         4 |       1 | 2 | 3 | 5 |
|         5 |       1 | 2 | 3 | 4 |
+-----------+---------+---+---+---+

OPTION (MAXRECURSION 1)এর ইনক্রিমেন্টে উপরের দিকে ব্যবহার এবং সামঞ্জস্য করা থেকে 1দেখা যায় যে এটি এমন একটি চক্রের ভিতরে প্রবেশ করে যেখানে প্রতিটি ধারাবাহিক স্তর ক্রমাগত আউটপুট 1,2,3,4এবং এর মধ্যে টগল করে 1,2,3,5

দ্বারা আলোচনা @Quassnoi মধ্যে এই ব্লগ পোস্টে । পর্যবেক্ষণের ফলাফলগুলির প্যাটার্নটি হ'ল প্রতিটি অনুরোধটি সেখানে কাজ করছে (1),(2),(3),(4),(5) EXCEPT (X)যেখানে Xআগের অনুরোধের শেষ সারিটি।

সম্পাদনা: এসকিউএল কিউইর চমৎকার উত্তরটি পড়ার পরে এটি উভয়ই পরিষ্কার হয় যে এটি কেন ঘটে এবং এটি পুরো গল্পটি নয় যে স্ট্যাকের মধ্যে এখনও প্রচুর পরিমাণে জিনিসপত্র রয়েছে যা কখনও প্রক্রিয়াজাত হতে পারে না।

অ্যাঙ্কর 1,2,3ক্লায়েন্ট স্ট্যাক সামগ্রীগুলিতে এমিট করে3,2,1

3 পপ অফ স্ট্যাক, স্ট্যাক সামগ্রী 2,1

এলএএসজে ফিরে আসে 1,2,4,5, স্ট্যাক সামগ্রী5,4,2,1,2,1

5 পপ অফ স্ট্যাক, স্ট্যাক সামগ্রী 4,2,1,2,1

এলএএসজে 1,2,3,4 স্ট্যাক সামগ্রীগুলি ফেরত দেয়4,3,2,1,5,4,2,1,2,1

4 পপড স্ট্যাক, স্ট্যাক সামগ্রীসমূহ 3,2,1,5,4,2,1,2,1

এলএএসজে 1,2,3,5 স্ট্যাক সামগ্রীগুলি ফেরত দেয়5,3,2,1,3,2,1,5,4,2,1,2,1

5 পপ অফ স্ট্যাক, স্ট্যাক সামগ্রী 3,2,1,3,2,1,5,4,2,1,2,1

এলএএসজে 1,2,3,4 স্ট্যাক সামগ্রীগুলি ফেরত দেয়4,3,2,1,3,2,1,3,2,1,5,4,2,1,2,1

যদি আপনি পুনরাবৃত্ত সদস্যকে যৌক্তিক সমতুল্য (সদৃশ / NUL এর অনুপস্থিতিতে) এক্সপ্রেশন দিয়ে প্রতিস্থাপন করেন

select a
from (
    select a
    from cte
    where a not in 
    (select a
    from r)
) x

এটি অনুমোদিত নয় এবং ত্রুটিটি উত্থাপন করে "সাবকিউরিতে পুনরাবৃত্ত তথ্যসূত্রগুলি অনুমোদিত নয় allowed" সুতরাং সম্ভবত এটি একটি তদারকি যা EXCEPTএমনকি এই ক্ষেত্রে অনুমোদিত।

সংযোজন: মাইক্রোসফ্ট এখন নীচে হিসাবে আমার সংযোগের প্রতিক্রিয়ায় প্রতিক্রিয়া জানিয়েছে

জ্যাকের অনুমান সঠিক: এটি একটি সিনট্যাক্স ত্রুটি হওয়া উচিত ছিল; EXCEPTধারাগুলিতে পুনরাবৃত্ত তথ্যসূত্রের প্রকৃতপক্ষে অনুমতি দেওয়া উচিত নয় । আমরা আসন্ন পরিষেবা রিলিজে এই বাগটি সমাধান করার পরিকল্পনা করছি। এর মধ্যে, আমি EXCEPT ধারাগুলিতে পুনরাবৃত্ত তথ্যগুলি এড়াতে পরামর্শ দেব ।

পুনরাবৃত্তি সীমাবদ্ধ করার ক্ষেত্রে EXCEPTআমরা এএনএসআই এসকিউএল স্ট্যান্ডার্ড অনুসরণ করি, যা পুনরাবৃত্তি চালু হওয়ার পরে থেকেই এই বিধিনিষেধকে অন্তর্ভুক্ত করেছে (১৯৯৯ সালে আমি বিশ্বাস করি)। EXCEPTএসকিউএল-এর মতো ঘোষিত ভাষাগুলিতে পুনরাবৃত্তির জন্য অর্থশাস্ত্রগুলি কী হওয়া উচিত (এটিকে "অস্ট্রাস্টাইয়েড নেগ্রেশন" নামেও ডাকা হয়) সে সম্পর্কে কোনও বৃহত্তর চুক্তি নেই । তদতিরিক্ত, একটি আরডিবিএমএস সিস্টেমে এ জাতীয় শব্দার্থবিজ্ঞান দক্ষতার সাথে (যুক্তিযুক্ত আকারের ডেটাবেসগুলির জন্য) কার্যকরভাবে প্রয়োগ করা কুখ্যাতভাবে কঠোর (যদি অসম্ভব না হয়) is

এবং দেখে মনে হচ্ছে যে চূড়ান্ত বাস্তবায়নটি ২০১৪ সালে 120 বা ততোধিকের উচ্চতার সামঞ্জস্যতার স্তরের ডেটাবেজের জন্য করা হয়েছিল ।

একটি এক্সেসপটি ধারাটিতে পুনরাবৃত্ত তথ্যসূত্রগুলি এএনএসআই এসকিউএল স্ট্যান্ডার্ডের সাথে সম্মতিতে ত্রুটি উত্পন্ন করে।

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