ওএন ক্লজের অবস্থান বলতে আসলে কী বোঝায়?


23

সাধারণ JOIN ... ON ...বাক্য গঠনটি সুপরিচিত। তবে ONধারাটি যেটির সাথে মিল রয়েছে তার থেকে পৃথকভাবে অবস্থান করাও সম্ভব JOIN। এটি এমন কিছু যা অনুশীলনে খুব কমই দেখা যায়, টিউটোরিয়ালগুলিতে পাওয়া যায় নি এবং আমি এমন কোনও ওয়েব সংস্থানও খুঁজে পাইনি যা এমনকি এটি উল্লেখযোগ্য বলে উল্লেখ করেছে।

এর সাথে চারদিকে খেলতে এখানে একটি স্ক্রিপ্ট রয়েছে:

SELECT *
INTO #widgets1
FROM (VALUES (1), (2), (3)) x(WidgetID)


SELECT *
INTO #widgets2
FROM (VALUES (1, 'SomeValue1'), (2, 'SomeValue2'), (3, 'SomeValue3')) x(WidgetID, SomeValue)

SELECT *
INTO #widgetProperties
FROM (VALUES
    (1, 'a'), (1, 'b'),
    (2, 'a'), (2, 'b'))
x(WidgetID, PropertyName)


--q1
SELECT w1.WidgetID, w2.SomeValue, wp.PropertyName
FROM #widgets1 w1
LEFT JOIN #widgets2 w2 ON w2.WidgetID = w1.WidgetID
LEFT JOIN #widgetProperties wp ON w2.WidgetID = wp.WidgetID AND wp.PropertyName = 'b'
ORDER BY w1.WidgetID


--q2
SELECT w1.WidgetID, w2.SomeValue, wp.PropertyName
FROM #widgets1 w1
LEFT JOIN #widgets2 w2 --no ON clause here
JOIN #widgetProperties wp
 ON w2.WidgetID = wp.WidgetID AND wp.PropertyName = 'b'
 ON w2.WidgetID = w1.WidgetID
ORDER BY w1.WidgetID


--q3
SELECT w1.WidgetID, w2.SomeValue, wp.PropertyName
FROM #widgets1 w1
LEFT JOIN (
    #widgets2 w2 --no SELECT or FROM here
    JOIN #widgetProperties wp
    ON w2.WidgetID = wp.WidgetID AND wp.PropertyName = 'b')
ON w2.WidgetID = w1.WidgetID
ORDER BY w1.WidgetID

কিউ 1 দেখতে সাধারণ দেখাচ্ছে। কিউ 2 এবং কিউ 3 এর এই ONধারাটির অস্বাভাবিক অবস্থান রয়েছে ।

এই স্ক্রিপ্টটি অগত্যা খুব বেশি অর্থবোধ করে না। অর্থবহ দৃশ্যের অবতারণা করা আমার পক্ষে কঠিন ছিল।

সুতরাং এই অস্বাভাবিক বাক্য বিন্যাসের অর্থ কী? এটি কীভাবে সংজ্ঞায়িত করা হয়? আমি লক্ষ্য করেছি যে দুটি পদের জন্য সমস্ত পদ এবং আদেশের ONঅনুমতি নেই। এটি পরিচালিত নিয়মগুলি কী কী?

এছাড়াও এই জাতীয় প্রশ্ন লিখতে কি কখনও ভাল ধারণা?

উত্তর:


32

আপনি যদি FROMক্লজ সিনট্যাক্স ডায়াগ্রামটি দেখেন তবে আপনি দেখতে পাবেন যে ONক্লজের জন্য কেবল একটি জায়গা রয়েছে :

<joined_table> ::= 
{
    <table_source> <join_type> <table_source> ON <search_condition> 
    ...
}

আপনি কি বিভ্রান্তির, সহজ পুনরাবৃত্তির কারণ <table_source>মধ্যে <joined_table> উপরে আরেকটি হতে পারে <joined_table>:

[ FROM { <table_source> } [ ,...n ] ] 
<table_source> ::= 
{
    table_or_view_name ... 
    ...
    | <joined_table> 
    ...
}

বিভ্রান্তি এড়াতে আপনার দৃষ্টিভঙ্গি পৃথক করার জন্য অ-সুস্পষ্ট ক্ষেত্রে (আপনার উদাহরণগুলির মতো) প্রথম বন্ধনী ব্যবহার করা উচিত <table_sources>; এগুলি কোয়েরি পার্সারের জন্য প্রয়োজনীয় নয় তবে মানুষের জন্য দরকারী।


33

এটি যোগদানের সাথে জড়িত যৌক্তিক সারণিগুলি নির্ধারণ করে।

একটি সাধারণ উদাহরণ সহ

SELECT w1.WidgetID,
       w2.SomeValue,
       wp.PropertyName
FROM   #widgets1 w1
       LEFT JOIN #widgets2 w2
         ON w2.WidgetID = w1.WidgetID
       JOIN #widgetProperties wp
         ON w2.WidgetID = wp.WidgetID
            AND wp.PropertyName = 'b'
ORDER  BY w1.WidgetID 

#widgets1এতে বাইরের #widgets2অংশে যোগ দেওয়া হয় - এর ফলাফলটি একটি ভার্চুয়াল টেবিল তৈরি করে যা অভ্যন্তরীণভাবে যুক্ত হয় #widgetProperties। প্রাকটিকের w2.WidgetID = wp.WidgetIDঅর্থ হ'ল প্রাথমিক বাহ্যিক জোড় থেকে যে কোনও নাল প্রসারিত সারিগুলি ফিল্টার আউট হয়ে কার্যকরভাবে কার্যকরভাবে সমস্ত অভ্যন্তরের সাথে যোগ দেয়।

এটি কিউ 2 থেকে পৃথক ...

SELECT w1.WidgetID,
       w2.SomeValue,
       wp.PropertyName
FROM   #widgets1 w1
       LEFT JOIN #widgets2 w2 --no ON clause here
                 JOIN #widgetProperties wp
                   ON w2.WidgetID = wp.WidgetID
                      AND wp.PropertyName = 'b'
         ON w2.WidgetID = w1.WidgetID
ORDER  BY w1.WidgetID

#widgets2ভিতরে অভ্যন্তরীণ হয় #widgetProperties। সেই যোগদানের ফলে ভার্চুয়াল টেবিলটি বাম বাহিরের যোগদানের ডান হাতের টেবিলটি হবে#widgets1

উদ্ভূত টেবিল বা সাধারণ টেবিল এক্সপ্রেশন ব্যবহার করে একই ফলাফল অর্জন করা যেতে পারে ...

WITH VT2
     AS (SELECT w2.WidgetID,
                w2.SomeValue,
                wp.PropertyName
         FROM   #widgets2 w2 
                JOIN #widgetProperties wp
                  ON w2.WidgetID = wp.WidgetID
                     AND wp.PropertyName = 'b')
SELECT w1.WidgetID,
       VT2.SomeValue,
       VT2.PropertyName
FROM   #widgets1 w1
       LEFT JOIN VT2
         ON VT2.WidgetID = w1.WidgetID
ORDER  BY w1.WidgetID 

... অথবা বিকল্পভাবে আপনি ভার্চুয়াল টেবিলগুলি পুনরায় অর্ডার করতে পারেন এবং এর RIGHT JOINপরিবর্তে একটি ব্যবহার করতে পারেন ।

SELECT w1.WidgetID,
       w2.SomeValue,
       wp.PropertyName
FROM   #widgets2 w2
       INNER JOIN #widgetProperties wp
               ON w2.WidgetID = wp.WidgetID
                  AND wp.PropertyName = 'b'
       RIGHT JOIN #widgets1 w1
               ON w2.WidgetID = w1.WidgetID
ORDER  BY w1.WidgetID 

এটি এখানে ইটজিক বেন গা coveredাকা রয়েছে

... JOIN শর্তাদি অবশ্যই টেবিল ক্রমের সাথে একটি চিস্টিক সম্পর্ক অনুসরণ করবে। এটি, যদি আপনি সারণিতে T1, T2, T3, এবং T4 নির্দিষ্ট করে থাকেন এবং JOIN শর্তগুলি T1 এর সাথে T2, T3 এর সাথে T2, এবং T3 টি T4 এর সাথে মেলে, আপনাকে অবশ্যই সারণির ক্রমের বিপরীতে JOIN শর্তাদি নির্দিষ্ট করতে হবে , এটার মত:

FROM   T1
       <join_type> T2 T2
                  <join_type> T3 T3
                             <join_type> T4
                               ON T4.key = T3.key
                    ON T3.key = T2.key
         ON T2.key = T1.key 

এই যোগদানের কৌশলটি অন্যভাবে দেখার জন্য, প্রদত্ত জোয়িন শর্তটি কেবল তার উপরে থাকা টেবিলের নামগুলি বা টেবিলের নামগুলিতে উল্লেখ করতে পারে যা পূর্ববর্তী JOIN শর্তাদি ইতিমধ্যে উল্লেখ করা হয়েছে এবং সমাধান হয়েছে।

তবে নিবন্ধটিতে বেশ কয়েকটি ভুলত্রুটি রয়েছে, লুবার কল্লারের ফলোআপ লেটারটিও দেখুন


ধন্যবাদ মার্টিন, এই উত্তরটি খুব সহায়ক। যদিও আমি অন্যটিকে গ্রহণ করব, কারণ আনুষ্ঠানিক ব্যাকরণ সম্পর্কে তাঁর বক্তব্যই বিষয়টি পুরোপুরি বুঝতে আমাকে সহায়তা করেছিল। বিশেষত "চিস্টিক সম্পর্ক" এটি একটি ভ্রান্ত ধারণা বলে মনে হয়। এটি একটি গাছ, কোনও তালিকা এবং বিপরীত তালিকা নয়। ইটজিক্সের ব্যাখ্যাটি কেন সঠিক নয় তা বুঝতে মুস্তাকিয়ো কাঠামো সরবরাহ করেছিলেন।
বুট লাইফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.