সাবকিউরিজগুলি 'প্রধান প্রশ্নের মতোই' এলিয়াস


23

আমার একটি এসকিউএল ক্যোয়ারী রয়েছে যার উপকরণগুলি তার সাব-কোয়েরির অন্যান্য এলিয়াসগুলির মতো।

উদাহরণ স্বরূপ:

select *
from ROOM r
where ...
         (
              select *
              from ROAD r
              where ...
         )

এটি সূক্ষ্মভাবে কাজ করে, কারণ সাব-কোয়েরির উপনামটি মূলটির আড়াল করে।

  1. এটি কি সব ক্ষেত্রেই সেভাবে কাজ করবে?
  2. আমি কি কখনও অপরিবর্তিত ফলাফল পাব?
  3. যদি এটি করা ঠিক হয় তবে আমি কীভাবে মূল প্রশ্নের সাথে একটি উল্লেখ করতে পারি r?

1
সংক্ষিপ্ত উত্তরগুলি হ'ল "১. হ্যাঁ", "২.নু" এবং "৩. এই ক্ষেত্রে, আপনি পারবেন না (সুতরাং আপনি যদি এই জাতীয় কোনও রেফারেন্স দিতে চান তবে এটি ঠিক ঠিক নয়)"
ypercubeᵀᴹ

উত্তর:


15

নেস্টেড সাবকিউরিয়াদের জন্য প্যারেন্ট ক্যোয়ারিতে ব্যবহৃত একই এলিয়াসগুলি ব্যবহার করা ঠিক আছে, যদিও কোডটি পড়ার জন্য কারও পক্ষে এটি কিছুটা বিভ্রান্তিকর হতে পারে। নেস্টেড সাবকোয়রিতে এলিয়াসের নামের স্থানটি পিতামাতার নামের স্থান থেকে পৃথক। উদাহরণস্বরূপ নীচের ক্যোয়ারিতে একটি নেস্টেড সাবকোয়ারি রয়েছে bযার bমধ্যে এটির সাথে একটি উলামও ব্যবহৃত হয়েছে। এটি প্রোগ্রামারটির কাছে সম্ভবত বিভ্রান্তিকর হবে তবে ডিবিএমএস ইঞ্জিনের সাথে জরিমানা:

   select a.foo
          ,b.bar
          ,b.BarCount
      from (select b.bar
                  ,count (*) as BarCount
              from BarTable b
              join OtherTable o
                on b.OtherTableID = o.OtherTableID
             group by b.bar) b
      join Foobar a
        on a.bar = b.bar

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

select a.foo
      ,b.bar
  from Foobar a
  join Bar b
    on b.FooBarID = a.FooBarID
 where not exists
       (select 1
          from Bar b2
         where b2.BarCategoryID = b.BarCategoryID
           and b2.BarDate > b.BarDate)

পারস্পরিক সম্পর্কযুক্ত সাবকোরির একটি উপনাম নেই কারণ এটি 1 এর মতো একটি যোগদানে অংশ নেয় না । রেফারেন্স bএবং এর b2জন্য barউভয়ই সাবকোয়ারির জন্য উপলভ্য কারণ সহ-সম্পর্কিত সাবকোয়ারিগুলি পিতামাতার সাথে উপাধিকার জন্য তাদের নাম স্থান ভাগ করে দেয়।


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


প্রথম ক্যোয়ারীর সাবকোয়ারিটি একটি উত্পন্ন টেবিল এবং স্ট্যান্ডার্ড এসকিউএলকে সর্বদা একটি নাম দেওয়া দরকার: এই প্রয়োজনীয়তার কোনও যৌক্তিক কারণ নেই তবে এসকিউএল সার্ভার এটি যেভাবেই বাস্তবায়িত করেছে, যদিও নির্দিষ্ট উদাহরণে আপনি একটি নাম পছন্দ করেছেন সত্যই প্রয়োজন। দ্বিতীয় ক্যোয়ারির সাবকোয়ারি কোনও উত্সযুক্ত টেবিল নয়, সুতরাং কেন এটির জন্য কোনও নামের প্রয়োজন হয় না (সত্য এটি পরস্পর সম্পর্কযুক্ত subquery অবিবাহীয়)।
onedaywhen

@ এমনেদয়াহেন - আমি কোনও পরিস্থিতির কথা ভাবতে পারি না তবে একটি সম্পর্কিত সম্পর্কযুক্ত সাবকোয়ারি যেখানে সাব-কোয়েরিতে পিতামাতার ক্ষেত্রে ব্যবহৃত উপাধিতে অ্যাক্সেস প্রয়োজন needs আপনার মনে কিছু নির্দিষ্ট ছিল?
কনফারডঅফটুনব্রিজ

আমি নিশ্চিত না যে আমি আপনার প্রশ্নটি বুঝতে পেরেছি। সম্ভবত আমার স্পষ্ট করে দেওয়া উচিত যে আমি আপনার মন্তব্যে বিশেষভাবে প্রতিক্রিয়া জানিয়েছিলাম, "পারস্পরিক সম্পর্কযুক্ত সাবকোয়ারির একটি উপ নাম নেই কারণ এটি এতে যোগদানের ক্ষেত্রে অংশ নেয় না।" আমার প্রতিক্রিয়াটি এমন বিন্দুটি বোঝানোর কথা ছিল যে পরিসীমা ভেরিয়েবলগুলি সম্পর্কিত (এসকিউএল স্ট্যান্ডার্ড 'পারস্পরিক সম্পর্কের নামগুলি এবং আপনি' এলিয়াস 'বলছেন) সম্পর্কিত বিধিগুলি সরাসরি তাদের অংশগ্রহণের সাথে সম্পর্কিত নয় (বা অন্যথায়) যোগ দেয়।
onedaywhen

সাধারণ উদাহরণ: SELECT * FROM ( SELECT c FROM T ) AS T2;- কোনও যোগ দেয় না, এখনও কোনও সম্পর্ক নেই এসকিউএল স্ট্যান্ডার্ডের জন্য প্রয়োজনীয় উত্পন্ন টেবিলটি একটি পরিসীমা পরিবর্তনশীল বরাদ্দ করা উচিত ( T2এই ক্ষেত্রে)।
onedaywhen

3

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

আমি বিশ্বাস করি না যে স্বতন্ত্রতা প্রয়োজন। আমি বিশ্বাস করি যে, যদি কোনও এলিফটি একটি সম্পর্কিত সম্পর্কিত সাবকোয়ারির সাথে একটি সম্পর্কিত নাম হিসাবে ব্যবহার করা হয়, পাশাপাশি বাইরের ক্যোয়ারিতে একটি টেবিলের নামও ব্যবহার করা হয়, তবে সাবকোয়ারিতে থাকা উপন্যাসটি অগ্রাধিকার গ্রহণ করবে।

উদাহরণ:

CREATE TABLE #T (A INT)
CREATE TABLE #U (A INT)
CREATE TABLE #V (A INT)

INSERT INTO #T (A) VALUES (1), (2), (3)
INSERT INTO #U (A) VALUES (2), (3), (4)
INSERT INTO #V (A) VALUES (3), (4), (5)

SELECT
    T1.A
FROM
    #T AS T1
    INNER JOIN #U AS T2 ON T1.A = T2.A
WHERE
    EXISTS (SELECT * FROM #V AS T2 WHERE T1.A = T2.A)

আউটপুটটি "3": টেবিলের T এবং U সমান 2 এবং 3 থাকে তবে WHEREভবিষ্যদ্বাণীটি আরও 3 টিতে সারি ফিরে আসে এবং V তে 2 টি বিদ্যমান থাকে না 2

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